2009-03-06 2 views
3

사이 및 및 26 %에 location.hash 차이 검출 : <script type="text/javascript">alert(location.hash);</script>간단한 자바 스크립트 코드로에 location.hash 분석

는 I가 &을 포함 GET 변수를 분리하는 어려운 시간을 가질을 (로 인코딩 % 26) 및 변수를 구분하는 데 사용되는 &.

일례 :

  • 코드 = PHP & 나이 = 15D

예 2 :

  • 코드 = PHP의 % 20 % 26 % 20code & 나이 = 15d

당신이 볼 수있는 바와 같이, 예를 들어 1은 아무런 문제가 없습니다 만, 자바 스크립트를 얻는 것은 "코드 = PHP & 코드"예를 두 가지에서 내 능력을 넘어 알고 :

(참고 : 난 정말 사용하지 않는이 변수 이름을 다른 이름으로 바꾸는 것은 검색 용어가 검색 키와 일치하지 않는 한 계속 작동하므로 유효한 솔루션으로 간주하지 않습니다.

+0

이 명확히 "내 능력이되고 있습니다", 제발? –

+0

decodeURIComponent를 찾고 계십니까? decodeURIComponent ('% 26') == '&' – Greg

+0

RoBorg, decodeURIComponent는 location.hash를 분석 할 때 도움이되지 않습니다. –

답변

4

부분 식별자 ('해시')의 26 %와 & 사이에는 차이가 없습니다 :

당신은 또한 같은 이상한 방법으로, (여기 JS 1.6)에서 문자열을 구문 분석 할 수 있습니다. '&'은 URI의 쿼리 ('검색') 세그먼트에서 특별한 의미를 갖는 예약 문자입니다. '&'에서 '% 26'(으)로 이스케이프 처리하는 것은 'a'에서 '% 61'(으)로 이스케이프 처리하는 것보다 더 이상 애플리케이션 수준의 가시성을 제공 할 필요가 없습니다.

조각 식별자 내에 구조화 된 데이터를 숨기기위한 표준 인코딩 체계가 없으므로 직접 만들 수 있습니다.예를 들어, 구성 요소의 문자를 인코딩하기 위해 '+ XX'진수 인코딩을 사용

hxxp://www.example.com/page#code=php+20+2B+20php&age=15d 

function encodeHashComponent(x) { 
    return encodeURIComponent(x).split('%').join('+'); 
} 
function decodeHashComponent(x) { 
    return decodeURIComponent(x.split('+').join('%')); 
} 

function getHashParameters() { 
    var parts= location.hash.substring(1).split('&'); 
    var pars= {}; 
    for (var i= parts.length; i-->0;) { 
     var kv= parts[i].split('='); 
     var k= kv[0]; 
     var v= kv.slice(1).join('='); 
     pars[decodeHashComponent(k)]= decodeHashComponent(v); 
    } 
    return pars; 
} 
0

첫 번째 예를 들어, &을 나눈 후 unescape ()을 호출하여 % 26을 &으로 변환하고 % 20을 공백으로 변환하십시오.

편집 : 나는 조금 오래된 그리고 난 (이 언 이스케이프 다르게 무엇을하는지에 대한 명확한 설명이 표시되지 않습니다하지만 당신은 지금 decodeURIComponent()를 사용해야처럼

이 보이는), 유니 코드를 제대로 처리하지 못한다는 점을 제외하고는.

+0

이것은 Eric이 시도하는 것이 아닙니다. 그는 코드 = "php & code"와 age = "15d"를 실현하기 위해 자바 스크립트를 얻으려고 노력하지만, 이전에는 &는 매개 변수 구문 분석을 방해하고 있습니다. –

+0

감사합니다. Andrey, 당신 말이 맞아요. location.hash의 이스케이프 (unescape)는 % 26과 & 사이의 차이를 볼 수 없습니다. –

1

Firefox 3.1에서 테스트하면 브라우저가 location.hash 변수를 채울 때 16 진수 코드를 적절한 문자로 변환하는 것처럼 보이므로 JavaScript가 원본 문자 또는 16 진수 코드를 알 수있는 방법이 없습니다.

&과 같은 문자를 해시 변수에 인코딩하려는 경우 다른 문자열로 바꾸는 것이 좋습니다.

function pairs(xs) { 
    return xs.length > 1 ? [[xs[0], xs[1]]].concat(pairs(xs.slice(2))) : [] 
} 

function union(xss) { 
    return xss.length == 0 ? [] : xss[0].concat(union(xss.slice(1))); 
} 

function splitOnLast(s, sub) { 
    return s.indexOf(sub) == -1 ? [s] : 
           [s.substr(0, s.lastIndexOf(sub)), 
           s.substr(s.lastIndexOf(sub) + sub.length)]; 
} 

function objFromPairs(ps) { 
    var o = {}; 
    for (var i = 0; i < ps.length; i++) { 
    o[ps[i][0]] = ps[i][1]; 
    } 
    return o; 
} 

function parseHash(hash) { 
    return objFromPairs(
      pairs(
      union(
       location.hash 
         .substr(1) 
         .split("=") 
         .map(
         function (s) splitOnLast(s, '&'))))) 
} 

>>> location.hash 
"#code=php & code&age=15d" 
>>> parseHash(location.hash) 
{ "code": "php & code", "age": "15d" } 
0

이 나를 위해 잘 작동 :

var hash = []; 
if (location.hash) { 
hash = location.href.split('#')[1].split('&'); 
} 
관련 문제