URL 해시 위치 가져 오기 및 jQuery에서 사용


135

현재 페이지의 URL에서 해시 값을 얻은 다음 새 함수에 적용 할 수 있습니다. 예 :

URL은

www.example.com/index.html#foo

그리고 나는 이것을 다음 코드와 함께 사용하고 싶습니다

$('ul#foo:first').show();

나는 이것을 잡아서 그것을 두 번째 코드에서 사용할 수있는 변수로 바꾸는 방법이 있다고 가정 / 호핑하고 있습니다.


8
나는 당신을위한 코드가 없지만 코드 삽입에 잘 익은 것처럼 입력을 위생 처리해야합니다.
Nate B

이 질문은 거의 10 년이 지났다는 것을 이해하는 것은 'ul#foo:first'ID 가 고유 해야하기 때문에 의미가 없으므로 :first유효하지 않은 ID를 복제하지 않는 한 선택기에 추가 하는 것은 중복됩니다. 10 년 전에도 반복 된 ID는 여전히 유효하지 않습니다.
j08691

10 년 전에는 여전히 틀렸다
Douglas Douglas

답변:


280

편집자 주 : 아래 접근 방식은 보안에 심각한 영향 을 미치며 사용중인 jQuery 버전에 따라 사용자를 XSS 공격에 노출시킬 수 있습니다. 자세한 내용은이 답변에 대한 의견 또는 Security Stack Exchange에 대한 설명에서 가능한 공격에 대한 설명을 참조하십시오 .

location.hash속성을 사용 하여 현재 페이지의 해시를 가져올 수 있습니다 .

var hash = window.location.hash;
$('ul'+hash+':first').show();

이 속성에는 이미 #시작 부분에 심볼 이 포함되어 있습니다 .

실제로 ID 선택기를:first 사용하기 때문에 의사 선택기 가 필요하지 않으며 ID는 DOM 내에서 고유 하다고 가정합니다 .

URL 문자열에서 해시를 얻으려면 다음 String.substring방법을 사용할 수 있습니다 .

var url = "http://example.com/file.htm#foo";
var hash = url.substring(url.indexOf('#')); // '#foo'

조언 : 사용자 원하는대로 해시를 변경 하여 선택기에 무언가를 주입 할 수 있으므로 해시를 사용하기 전에 확인해야합니다.


30
jQuery 선택기는 사용자 정의 자바 스크립트 코드를 실행하는 데 사용할 수 있으므로 비 위생 해시를 사용하는 것은 끔찍하고 안전하지 않습니다. 삽입 된 코드 앞에 #가 ​​포함 된 선택기의 최신 jQuery 버전에서는이 문제에 대한 반값 수정이 있지만 location.hash의 시작 부분에서 # 표시를 제거하면 여전히 위험에 노출됩니다. 예 : var hash = location.hash.slice(1); $('ul.item'+hash).show().append($('#content'));해시에 넣은 스크립트 태그가 실행됩니다. $('body').find('ul'+hash+':first')대신에 사용하는 것이 좋습니다 $('ul'+hash+':first').
Tgr

40
일부 브라우저는 해시 기호를 반환하고 일부 브라우저는 사용하지 않는 것이 더 안전합니다.var hash = location.hash.replace('#', '');
Tim

12
Alice는 웹 사이트를 운영하고 Bob은 웹 사이트를 방문하여 인증하고 세션 쿠키를받습니다. 찰리는 Bob에게 브라우저를 닫을 수도 있습니다. Charlie는 Bob에게 "이 멋진 링크를 확인하십시오!"라는 메일을 보냅니다. Bob이 링크를 열면 Charlie가 제어하는 ​​사이트로 연결됩니다. 이 페이지는 Bob의 브라우저를 해시에 공격 페이로드가있는 Alice 사이트의 페이지로 리디렉션합니다. 페이로드가 실행되고 브라우저는 여전히 쿠키를 기억하기 때문에 쿠키를 Charlie에게 보낼 수 있습니다.
Tgr

2
@Tgr, 점을 정교하게 연결해 주셔서 감사합니다. 이 구체적인 예는 저 (그리고 다른 사람들도)를 안전하게 지키는 데 더주의를 기울이게합니다.
snapfractalpop

2
@buffer : 과부하로 $(userInput)인해 일반적으로 안전하지 않으며 $문자열에 <>문자가 있는지 여부에 따라 기존 노드를 검색하거나 새 노드를 작성할 수 있습니다 . $(document).find(userInput)항상 기존 노드를 검색하므로 덜 안전합니다. 즉, 가장 좋은 방법은 항상 사용자 입력을 삭제하는 것입니다. 예를 들어 영숫자 ID를 사용하는 경우 영숫자인지 확인하십시오.
Tgr

35

location.hash는 IE (IE9 포함)의 경우 페이지에 iframe이 포함 된 경우 iframe 콘텐츠 내에서 수동 새로 고침 후 location.hash 값이 old (첫 번째 페이지로드 값)를 얻는 경우 IE에 안전하지 않습니다 . 수동 검색 값은 location.hash와 다르므로 항상 document.URL을 통해 검색하십시오.

var hash = document.URL.substr(document.URL.indexOf('#')+1) 

7
업데이트 : document.URL은 firefox 3.6에서 해시 값을 포함하지 않으므로 location.href는 안전합니다 var hash = location.href.substr (location.href.indexOf ( '#') + 1)
Deepak Patil

4

순수한 자바 스크립트 솔루션을 찾는 사람들을 위해

 document.getElementById(location.hash.substring(1)).style.display = 'block'

시간이 절약되기를 바랍니다.


3

jQuery 1.9부터는 :target셀렉터가 URL 해시와 일치합니다. 그래서 당신은 할 수 있습니다 :

$(":target").show(); // or $("ul:target").show();

해시와 일치하는 ID를 가진 요소를 선택하여 표시합니다.


match id 대신 해시를 문자열로 추출하는 방법이 있습니까?
인애

@ina jQuery에서 해시를 :target문자열로 얻는 것을 의미 합니까? 그렇다면 나는 그렇게 믿지 않습니다.
j08691

1

현재 페이지에 해시가 있으면 먼저 더 나은 cek을 제안합니다. 그렇지 않으면입니다 undefined.

$(window).on('load', function(){        
    if( location.hash && location.hash.length ) {
       var hash = decodeURIComponent(location.hash.substr(1));
       $('ul'+hash+':first').show();;
    }       
});

1

@CMS의 답변에 언급 된 보안 영향을 해결하기 위해 이것을 사용하고 있습니다.

// example 1: www.example.com/index.html#foo

// load correct subpage from URL hash if it exists
$(window).on('load', function () {
    var hash = window.location.hash;
    if (hash) {
        hash = hash.replace('#',''); // strip the # at the beginning of the string
        hash = hash.replace(/([^a-z0-9]+)/gi, '-'); // strip all non-alphanumeric characters
        hash = '#' + hash; // hash now equals #foo with example 1

        // do stuff with hash
        $( 'ul' + hash + ':first' ).show();
        // etc...
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.