2013-09-06 3 views
3

[이것은 정확하게 프로그래밍 문제는 아니지만 프로그래머가 가장 잘 대답 할 수있는 퍼즐입니다. 나는 프로 웹마 스터 사이트에서 압도적 인 침묵을 느꼈다.]왜이 % 2B 문자열이 urldecode되고 있습니까?

우리 웹 사이트에 이메일 주소 확인 절차가 있습니다. 이 사이트는 제 문자열로 적절한 키를 생성

mykey 

그러므로 바이트의 무리로서 키

&$dac~ʌ����! 

그런 다음에 base64 때문에 바이트

JiRkYWN+yoyIhIQ== 

의 무리를 코딩하는 것이 코딩 이 키는 HTML 전자 메일에 삽입 할 URL의 쿼리 문자열 값으로 제공 될 예정입니다. 먼저 URLEncode를 입력 한 다음 결과를 HTMLEncode로 지정해야합니다 (HTMLEncoding i의 효과는 없습니다.

click <a href="http://myapp/verify?key=JiRkYWN%2ByoyIhIQ%3D%3D">here</a>. 
Or paste <b>http://myapp/verify?key=JiRkYWN%2ByoyIhIQ%3D%3D</b> into your browser. 

경우 : N 예제의 경우,하지만 내가 좋아하는 이메일의 일부, 뭔가로 전송됩니다 이것은 다음 HTML에 포함되어

JiRkYWN%2ByoyIhIQ%3D%3D 

예)를 재 작업을 방해 할 수 없다 받는 사용자가 링크를 클릭하면 사이트에서 요청을 받고 쿼리 문자열 'key'매개 변수의 값을 추출하고 base64에서 디코드하고 해독 한 다음 사이트 로직 측면에서 적절한 작업을 수행합니다.

경우에 따라 클릭 수가 비효율적이라고 신고하는 사용자가 있습니다. 하나는 이러한 사용자는 우리에게 그가 보낸 한 이메일을 전달하고, 검사에 HTML은

의 % 2B 문자열입니다
click <a href="http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D">here</a> 
Or paste <b>http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D</b> into your browser. 

(위의 예 측면에 넣어)로 변환했다 -하지만 아무도 다른 백분율 인코딩 된 문자열은 더하기로 변환되었습니다. (정확한 값은 이고, 적절한 값은입니다. 적절한 SMTP 로그를 보았습니다.)

  1. 이 내가 그 바보하고있어 뭔가 내가 볼 수없는,, 또는

  2. 일부 메일 클라이언트 :

    key=JiRkYWN%2ByoyIhIQ%3D%3D 
    key=JiRkYWN+yoyIhIQ%3D%3D 
    

    그래서 나는 가능성의 몇 가지가 있다고 생각 % 2b 문자열을 더하기 기호로 변환하여 사람들의 문제에 실수로 대처하려고 시도합니다. URL 인코딩 및 부호 더하기

1의 경우 - 무엇입니까? 2의 경우 - 이런 종류의 시나리오를 다루는 표준, 알려진 방법이 있습니까?어떤 도움

답변

1

문제에 대한

많은 감사는 HTML이로 변신했다 검사에서이 단계

에 자리 잡고

click <a href="http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D">here</a> 
Or paste <b>http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D</b> into 
your browser. 
(위의 예 측면에 넣어)

즉, % 2B 문자열 - 다른 백분율로 인코딩되지 않았습니다. s 귀걸이는 플러스로 변환되었습니다.

"반대쪽 끝"에있는 애플리케이션에 이스케이프 처리가 누락되어 있어야합니다. 에 관계없이 거기 % 2B 또는 perls 같은 + 함수 uri_unescape 일관성 답변

DB<9> use URI::Escape; 
DB<10> x uri_unescape("JiRkYWN+yoyIhIQ%3D%3D") 
0 'JiRkYWN+yoyIhIQ==' 
DB<11> x uri_unescape("JiRkYWN%2ByoyIhIQ%3D%3D") 
0 'JiRkYWN+yoyIhIQ==' 
다음

발생한다 무엇을 반환하는 경우의. 내가 보여주고있는 것은 모두 단계들입니다. 나는 디버거에서 perl을 사용하고있다. 단계 54는 문자열을 base64로 인코딩합니다. 단계 55는 base64로 인코딩 된 문자열을 URI 이스케이프 매개 변수로 만들 수있는 방법을 보여줍니다. 56 단계와 57 단계는 클라이언트 측에서 해독해야하는 단계입니다.

한 가지 가능한 해결 방법은 base64 "키"에 더하기 기호가 포함되지 않도록하는 것입니다.

DB<53> $key="AB~" 
    DB<54> x encode_base64($key) 
0 'QUJ+ 
' 
    DB<55> x uri_escape('QUJ+') 
0 'QUJ%2B' 
    DB<56> x uri_unescape('QUJ%2B') 
0 'QUJ+' 
    DB<57> $result=decode_base64('QUJ+') 
    DB<58> x $result 
0 'AB~' 
+0

답장을 보내 주셔서 감사합니다. 위에서 뭘하는지 이해가 안되지만 메일 클라이언트가 이상한 일을해야한다는 것에 동의합니다. – Yellowfog

0

URLDECODE가 URL에 공백 문자로 해석되고있는 +,로 %2b를 돌고 것을 여기에서 발생 될 수 있습니다 것은. 나는 문자열을 먼저 urldecoding하여 비슷한 문제를 극복 할 수 있었고, replace 함수를 사용하여 디코드 된 문자열의 공백을 + 자로 바꾼 다음 "고정 된"문자열을 해독 할 수있었습니다.