querystring을 얻는 방법 urlencoded 또는 asp.net에서 퍼센트 캐릭터가있을 때
-
08-07-2019 - |
문제
QueryString이 urlencoded 또는 asp.net에 퍼센트 문자가있을 때 요청 객체에서 실제 쿼리 스트링을 얻는 방법은 무엇입니까?
기본적으로 다음과 같은 URL이있는 경우 다음과 같습니다. Default.aspx?p=%b4
, "%b4"로 문자열이 채워진 문자열을 어떻게 얻습니까?
Request.QueryString["p"]
인쇄 할 수없는 문자를 반환합니다.
Request.RawUrl
default.aspx? p =%ufffd를 반환합니다. "
Request.Url.AbsoluteUri
기본값을 반환합니다 .aspx? p =%ef%bf%bd
"%b4"를 어떻게 되돌릴 수 있습니까?
해결책
나는 이것을 더 파고 들었고, 이것의 원인을 알고 있다고 생각합니다. HTTP 클라이언트는 URL을 제대로 인코딩하지 않은 서버에 URL을 제출하고 있습니다. 구체적으로 URL에는 잘못된 문자가 있습니다.
재현하려면 URL 끝에 다음을 IE8에 붙여 넣습니다. default.aspx?p=´
와이어 위로가는 바이트를 검사하는 경우 (예 : 바이올리니스트), 실제 HEX B4 문자가 URL에서 클라이언트에서 서버로 전송되는 것을 볼 수 있습니다. URL은 0x80의 숯 코드로 제한되기 때문에 URL의 불법 문자입니다 (0x80보다 큰 숯 코드는 백분율에 이스케이프해야 함).
따라서 클라이언트는 잘못된 문자를 전달하고 있으며 서버는 가짜 문자를%EF%BF%BD로 대체합니다. 유니 코드 교체 문자 (U+0FFD), 이것은 로컬 인코딩에서 동등한 캐릭터가 발생할 때 발생합니다.
Afaik, 이것은 IE의 버그입니다. Firefox에 동일한 URL을 입력하면 Firefox가 URL을 올바르게 인코딩합니다 ( '대신 %B4). 또한 AFAIK에서도 문제는 유효하지 않은 문자를 IE의 주소 표시 줄에 수동으로 붙여 넣을 때만 발생합니다. 동일한 문자가 링크에 존재하는 경우, IE는 URL을 올바르게 인코딩하는 것으로 보입니다 (적어도 테스트 한 경우).
따라서 누가이 가짜 URL을 보내고 있는지 알아 내고 URL을 올바르게 인코딩하라고 지시해야합니다!
다른 팁
ASP.NET은 request.queryString [ "키"]를 수행 할 때 자동으로 URL 디코딩을합니다. 다시 인코딩하면됩니다.
HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]
원시 쿼리 문자열을 반환합니다
나는 같은 문제가 있었다. QueryString에 위배되는 동안 JavaScript "Escape ( 'Text % Text')"를 추가하여 해결했습니다!