QueryString이 URLDecode 뒤에 변형되었습니다.


15

QueryString을 통해 C# .Net 웹 응용 프로그램에 Base64 문자열을 전달하려고합니다. 문자열이 도착하면 "+"(더하기) 기호가 공백으로 바뀝니다. 자동 URLDecode 프로세스가이를 수행하는 것 같습니다. 나는 QueryString을 통해 전달되는 것을 제어하지 못한다. 이 서버 측을 처리 할 방법이 있습니까?

예 :

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

는 생산 :

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

사람들은 쿼리 문자열에는 urlencoding 제안 : 내가 할 수없는

System.Web.HttpUtility.UrlEncode(yourString) 

을 그 나는 호출을 통제 할 수 없기 때문에 루틴 (다른 언어와 잘 작동 함).

또한 더하기 기호와 공백을 대체하는 제안이 있었다 :이의하지만했다

Request.QueryString["VLTrap"].Replace(" ", "+"); 

하지만 내 우려, 나는이 시작 언급한다, 내가 없다는 것입니다 다른 문자는 더하기 기호 이외에 형식이 잘못되었을 수 있습니다.

내 주요 목표는 QueryString을 가로 채기 전에 디코더를 통해 실행하는 것입니다.

이렇게하려면 Request.QueryString.toString()을 살펴 보았습니다.하지만 여기에는 잘못된 형식의 정보가 포함되어 있습니다. 어떤 방법으로 원시 QueryString 을보기 전에 URLDecoded입니까? 더 나아가 닷넷은 모든 인코딩 된 URL을이기 위하여 QuerString에서 들어오는 것으로 예상하지만, 브라우저가 자동으로 URL 인코딩 GET 요청을하지 않는 것 같습니다 테스트 후

.

  0

OK : <p></p>이 블로그 게시물을 참조하십시오.질문은 명시 적으로 QueryString으로 전달되는 것을 변경할 방법이 없다고 명시하지만 모든 정답 (즉, base64 디코딩 전에 더하기로 공간을 바꿉니다)이 선정되었습니다. 그림 이동 ... 23 sep. 082008-09-23 22:32:06

11

공간, 그 합법적 인 전술을 ... 가지고 suposed되지 않기 때문에.

당신은 그러나 URL이 주어진 문제를 해결하려고한다; 더하기 기호는 공백을 나타 내기 때문에 더하기 기호는 URL에서 "% 2B"로 인코딩되어야합니다.

인바운드 URL을 제어하지 않으면 가장 많이 발생하는 오류를 피할 수 있으므로 첫 번째 옵션을 사용하는 것이 좋습니다.

+2

가장 쉬운 방법은 Uri.EscapeDataString/Uri.UnescapeDataString을 사용하는 것입니다. 09 dec. 112011-12-09 20:46:47


1

당신이 URL에 추가하기 전에 문자열을를 urlencode 경우 이러한 문제 중 하나가되지 않습니다 (자동 URLDECODE이 원래 상태로 돌아갑니다).


0

나는 C# 개발자는 아니지만 url로 보내기 전에 Base64 문자열을 인코딩해야한다고 생각합니다.

+1

그는 URL을 제어 할 수 없습니다 - 그의 질문을보십시오. 23 sep. 082008-09-23 21:36:24


0

공간이 +라고 가정하고 대체 할 수 있습니까?

Request.QueryString["VLTrap"].Replace(" ", "+"); 

)


1

글쎄, 분명 당신은 Base64로 문자열을 서버로 보내기 전에 urlencode되고 있어야합니다.
이를 수행 할 수 없다면 단순히 포함 된 공백을 +로 바꾸는 것이 좋습니다. B64 문자열은 수동으로 값 (argument.Replace(' ', '+'))를 교체하거나 상담 HttpRequest.ServerVariables["QUERY_STRING"] (심지어 더 HttpRequest.Url.Query)을하고 스스로를 구문 분석 할 수

  0

"글쎄, 분명히 서버에 보내기 전에 URL 인코딩 된 Base64 문자열을 가져야합니다.".... 그는 그걸 통제 할 수 없다고 말했습니다. 23 sep. 082008-09-23 21:43:03

  0

따라서 분명히 ... 그리고 이후의 대안. 23 sep. 082008-09-23 23:06:10


1

System.Web.HttpUtility.UrlEncode(yourString) 트릭을 수행합니다.


1

빠른 해킹으로 base64 디코딩 전에 공간을 더하기 문자로 바꿀 수 있습니다.


14

제안 된 솔루션 :

Request.QueryString["VLTrap"].Replace(" ", "+"); 

가 잘 작동합니다. 귀하의 우려 사항에 관해서는 :

나는 이것을 가지고 있지만 내 관심사가있다. 시작하려면이 말을해야했는데, 다른 문자가 더하기 기호 이외에 어떤 형식인지는 모르겠다. .

reading about base64으로 완화하기가 쉽습니다. 현대 base64에서 합법적 인 영숫자가 아닌 문자는 "/", "+"및 "="(패딩에만 사용됨)입니다.

그 중 "+"는 URL에서 이스케이프 처리 된 표현으로 특별한 의미를 지닌 유일한 것입니다. 다른 두 개는 URL (경로 구분 기호 및 쿼리 문자열 구분 기호)에서 특별한 의미를 가지지 만 문제가되지 않습니다.

그래서 나는 괜찮다고 생각합니다.


4

내 URL을 제어 할 수 없다는 점을 제외하고는 똑같은 문제가 있습니다. 심지어 Server.URLDecodeServer.URLEncode으로는 다음과 같이 내 쿼리 문자열이 보인다하더라도, 다시 + 기호로 변환하지 않습니다

 
http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d 

을 나는 다음을 수행합니다.

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]); 

는 여전히 + 기호에 다시 %2b을 변환하지 않습니다. 대신 다음을 수행해야합니다.

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]); 
tokenID = tokenID.Replace(" ", "+"); 

그러면 올바르게 작동합니다. 정말 이상합니다.

+5

나는 똑같은 문제를 안고있었습니다. 'Request.QueryString [ "TokenID"]'는 이미 URL로 인코딩 된 문자열을 반환합니다. Server.UrlDecode에 전달하여 urldecoding을 두 번 수행합니다. 11 jan. 122012-01-11 19:55:17


2

Base64 값이 포함 된 매개 변수와 '+'와 함께 제공되는 매개 변수에 비슷한 문제가있었습니다. Request.QueryString [ "VLTrap"] 만 Replace ("", "+"); 나를 위해 잘 일했다. UrlEncode 또는 다른 인코딩을 지원하지 않습니다. 인코딩 된 링크를 '+'인코딩 된 페이지에 '% 2b'로 인코딩 한 경우에도 표시 될 때 처음에는 '+'로 변경하고 브라우저를 클릭하면 브라우저가 '+'로 변경됩니다 그것을 빈 공간으로 바꾼다. 따라서 원래의 포스터로 제어 할 수있는 방법은 직접 링크를 표시하는 경우에도 마찬가지입니다. html 전자 메일에서도 이러한 링크가있는 것과 같은 것입니다.


1

System.Uri.UnescapeDataString(yourString)을 사용하는 경우 +을 무시합니다. 이 메소드는 문자열이 클라이언트 또는 서버에서 일종의 기존 접근법을 사용하여 인코딩 된 경우와 같은 경우에만 사용해야합니다. 그래서 지금은 SO 작동하는 방법에 손실에서 완전히 해요, http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx