추천: "PHP Video Tutorial"
PHP의 URL에 특수 문자로 인해 발생하는 문제(+,,=)
머리말, 특정 채널에서 작업하는 과정에서 서명 확인 오류를 발견했습니다. . 그런데 당시에는 동일한 처리 방법을 사용하는 두 곳에서 서명 검증 성능이 일관되지 않았던 것은 두 곳의 요청 방식이 다르기 때문이라고 생각했습니다. 포스트 방식. 물론 문제는 get이어야합니다.
GET 및 POST
GET 요청 방식은 매개변수가 URL에 배치되므로 전달 시 브라우저 측에서 전략적인 문제가 있을 수 있으며 매개변수가 Urlencoded됩니다. 따라서 서버 측에서 매개변수를 얻을 때 원본 데이터가 아닐 수도 있습니다. 따라서 GET을 통해 데이터를 요청할 때 처리가 이루어지지 않으면 서명 검증에 문제가 발생할 수 있습니다. 여기서 가능성은 base64 처리 후에 특수 문자 +가 포함되지 않고, GET 메소드 이후에 +가 아무런 처리 없이 빈 문자열일 수 있다는 것입니다.
POST 요청 방법은 요청 본문에 매개변수를 넣습니다. HTTP 전송 프로세스 중에는 브라우저의 일부 전략적 문제로 인해 매개변수가 처리되지 않습니다. 따라서 POST 요청을 통해 매개변수 서명 검증을 수행할 때 문제가 없으며, 서명 검증이 원활하게 수행될 수 있다. 하지만 채널 제공자에게 get 요청을 post 요청으로 바꿔달라고 요청할 방법이 없으므로 우리는 스스로 방법을 찾을 수밖에 없습니다.
urlencode 및 urldecode
urlencode: (PHP 4, PHP 5, PHP 7) urlencode — 编码 URL 字符串 string urlencode ( string $str )
이 함수는 문자열 인코딩을 용이하게 하고 이를 URL의 요청 부분에 사용하며 다음 페이지로 변수를 전달하는 것도 용이하게 합니다.
return
-_를 제외한 모든 영숫자가 아닌 문자가 퍼센트 기호(%) 뒤에 두 개의 16진수 숫자로 바뀌고 공백이 더하기 기호( +)로 인코딩되는 문자열을 반환합니다. 이 인코딩은 WWW 형식 POST 데이터의 인코딩과 동일하며 application/x-www-form-urlencoded의 미디어 유형 인코딩과 동일합니다.
urldecode: (PHP 4, PHP 5, PHP 7)
urldecode — 인코딩된 URL 문자열을 디코딩합니다.
string urldecode ( string $str )
Decode가 임의 %로 제공됩니다. ## 인코딩된 문자열에 있습니다. 더하기 기호('+')는 공백 문자로 디코딩됩니다.
디코딩된 문자열을 반환합니다.
우리는 공백으로 변하는 문자열인 +를 처리하는 "완벽한 방법"인 빛을 본 것 같습니다. 즉, 서명 문자열을 urlencode하여 암호화합니다. 그런 다음 fxxk, false를 확인하세요. 그래도 통과하지 못한다면, 뺨을 때리세요. base64 암호화 후에는 패딩 문자열 =이 표시되는데 이는 매우 고통스럽습니다. 그래서 임시 해결책을 생각해 냈습니다.
urlencode(substr($str,0,strlen($sign)-2)).substr($sign,strlen($sign)-2)
당시 base64에는 최대 2개의 ==가 있었던 점을 고려하면 마지막 2개에는 urlencode 처리가 수행되지 않았습니다. 이는 기본적으로는 처리가 가능하지만, 뒤 두 자리에 +가 나타나면 작동하지 않는 문제가 있을 수 있습니다. 물론 이 계획은 설득력이 없고 번복될 수 없습니다. 그리고 이 과정에서 발견된 문제점은 전달된 서명 문자열이 urlencode에 의해 처리되었을 수도 있다는 점입니다. 이것은 여전히 작은 문제입니다. 디코딩이 오해를 일으키지 않기 때문에 먼저 urldecode 처리를 수행하십시오.
그때 친구가 해결책을 제안했는데, 즉 + 기호만 바꾸는 것만으로도 충분하지 않을까요? 실제로 이것이 방법입니다. 그런데 이 방법은 정말 답답할 것 같습니다. 앞으로 암호화 알고리즘이 변경되거나 @#\%...&**( 등의 다른 특수 문자가 추가되면 모두 일치하고 교체할 수는 없습니다. 해결 방법에 동의하지만 계속 생각합니다.
rawurlencode 및 rawurldecode
rawurlencode: (PHP 4, PHP 5, PHP 7)
rawurlencode — RFC 3986에 따라 URL을 인코딩합니다.
string rawurlencode ( string $str )
RFC 3986에 따라 지정된 문자를 인코딩합니다.
rawurldecode: (PHP 4, PHP 5, PHP 7)
rawurldecode — URL을 인코딩합니다. URL 문자열을 디코딩합니다.
string rawurldecode ( string $str )
문자열을 반환합니다. 이 문자열에서 퍼센트 기호(%) 뒤에 오는 두 개의 16진수 숫자는 리터럴 문자로 대체됩니다.
새로운 새벽이 나타났습니다. rawurldecode를 리터럴 문자로 바꾸세요. .. 그럼 해결책이 준비되었습니다.
rawurldecode(urlencode(urldecode($sign))));
얼핏 보면 너무 부풀어오르는 것 같은데 왜 이렇게 처리해야 할까요? 왜 그런지는 위의 자랑글
을 읽어보세요. , 두 가지 준비가 필요합니다. 하나는 생산 환경이 정상으로 돌아올 때 현재 문제를 신속하게 해결할 수 있는 임시 솔루션이지만 장기적으로 안정적이고 신뢰할 수 있는 솔루션이 있어야 합니다. 솔루션은 귀하의 지속적인 시도에서 나옵니다. 그리고 php.net.
위 내용은 PHP URL(+,\,=)의 특수 문자로 인해 발생하는 문제를 분석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!