2008-10-27 2 views
7

내 웹 응용 프로그램에서 내 매개 변수는 모든 종류의 미친 문자 (러시아어 문자, 슬래시, 공백 등)를 포함 할 수 있으므로 URL에 항상있는 것처럼 표현 될 수는 없습니다.
메리 방식으로 보내면 약 50 %에서 작동합니다. 공백과 같은 것들은 이미 어딘가에 인코딩되어 있습니다 (Html.BuildUrlFromExpression에서 추측합니다). 하지만 다른 것들 (예 : "/"및 "*")은 그렇지 않습니다.Double/incomplete 매개 변수 URL 인코딩

이제는 더 이상 무엇을 해야할지 모르겠다. 내가 직접 인코딩하면 내 인코딩이 부분적으로 다시 인코딩되어 잘못된 결과가 발생합니다. 인코딩하지 않으면 일부 문자가 통과하지 않습니다.

내가 한 것은 수동으로 .replace()에 문제가있는 문자입니다.
이것은 물론 좋은 생각이 아닙니다.

아이디어가 있으십니까?

--Edit--
는 내 처분에 인코딩/디코딩 라이브러리의 다수가 알고있다. mvc 프레임 워크가 이미 나를 위해이 작업을 수행하려하지만 완전히 완료되지 않은 것처럼 보입니다.

<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!"> 

나에게 슬래시, 별표 및 앰퍼샌드 탈출하지 않는 방법

<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!"> 

공지 사항을 렌더링합니다. 왜 일부는 탈출 했습니까? 어떻게하면 제대로 탈출 할 수 있습니까?

내가 잘못했거나 프레임 워크입니까?

답변

0

인코딩을 수행하려면 Server.UrlEncode() 메서드를 사용하고 디코드하려면 Server.UrlDecode() 메서드를 사용해 보셨습니까?

항목을 전달하는 데 문제가 없었습니다.

+0

의견을 보내 주셔서 감사합니다. 제가 작성한 편집본에 대한 원본 게시물을 확인하십시오. 제 질문이 충분히 명확하지 않다고 생각합니다. –

0

Server.URLEncode 또는 HttpServerUtility.UrlEncode 나는 당신이 지금 무슨 말을하는지 볼 - 나는 질문을 MVC 특정 몰랐어요. MVC 프레임 워크의 해당 부분의 한계처럼 보입니다. 특히 BuildUrlFromExpression은 일부 URL 인코딩을 수행하지만 프레임 워크 URL의 일부로 이러한 구두점 중 일부가 필요합니다.

또한 불행하게도에는 urlencoding는 불변을 생성하지 않습니다

, 즉

URLEncode(x) != URLEncode(URLEncode(x)) 

는 그 좋지 않을까. 그러면 변수를 미리 인코딩 할 수 있으며 이중으로 인코딩되지 않습니다.

아마 ASP.NET MVC 프레임 워크가이를위한 최상의 방법 일 것입니다. 당신이 할 수있는 또 다른 일은 base64 나 URLEncode-invariant 인 코드로 인코딩하는 것입니다.

+0

이상하게도 UrlEncode는 http://www.w3schools.com/TAGS/ref_urlencode.asp를 사용하지 않습니다. 예를 들어 스페이스는 % 25로 인코딩됩니다. –

+0

HttpUtility.UrlPathEncode가 수행합니다. –

+0

사실 내 문제입니다. 다시 전달해 주셔서 감사합니다. –

2

매개 변수는 Uri.EscapeDataString를 사용하여 탈출해야합니다

  string url = string.Format("http://www.foo.bar/page?name={0}&address={1}", 
       Uri.EscapeDataString("adlknad /?? lkm#"), 
       Uri.EscapeDataString(" qeio103 8182")); 

      Console.WriteLine(url); 
      Uri uri = new Uri(url); 
      string[] options = uri.Query.Split('?','&'); 
      foreach (string option in options) 
      { 
       string[] parts = option.Split('='); 
       if (parts.Length == 2) 
       { 
        Console.WriteLine("{0} = {1}",parts[0], 
         Uri.UnescapeDataString(parts[1])); 
       } 
      } 
+0

의견에 감사드립니다. 그러나 asp.net-mvc 태그에 유의하십시오. 나는 물건을 정리하기 위해 나의 질문을 편집했다. –

+0

태그가 빠르게 변경됩니다. 나는 단지 원래의 질문에 의해 갔다 .-p 그러나 충분히 공정하다. –

0

Microsoft Anti-Cross Site Scripting library를 사용해보십시오. 여기에는 모든 문자 (# 및 다른 언어의 문자 포함)를 인코딩하는 여러 Encode 메서드가 포함되어 있습니다.디코딩의 경우 인코딩 된 URL을 브라우저에서 처리해야하지만 URL을 수동으로 디코딩해야하는 경우 Uri.UnescapeDataString

희망이 있습니다.

+0

그것은 유용한 링크 다. 그러나 나는 그것이 나의 문제를 해결할 수 없을 것이라고 생각한다. 나는 나의 편집에서 내 문제를 더 분명하게하려고 애썼다. 한번 봐주세요. –

0

URL의 경로 부분에서 슬래시와 점을 이스케이프하는 것은 보안상의 이유로 금지되어 있습니다 (전반적으로 모노로 작동 함).

+0

그 이유는 무엇입니까? 이러한 것들을 필요로하는 매개 변수는 무엇입니까 ... 나는 이것들을 가지고 있지 말아야한다는 것을 알고 있지만 그것은 외부 데이터 소스입니다. 사람들은 그것을 사용하여 물건을 검색합니다. 데이터를 변경할 수있는 방법이 없습니다 ... –

0

Html.BuildUrlFromExpression을 수정해야합니다. 그러면이 업스트림을 MVC 프로젝트에 제출해야합니다. 또는 BuildUrlFromExpression으로 전달하기 전에 인코딩을 수행하고 반대쪽에서 다시 나오는 경우 디코딩합니다.

IIS가 url 문자열의 디코딩을 사전에 처리하고있을 수 있으므로 쉽게 해결할 수 없을 수도 있습니다 ... 유틸리티 메서드에서 대체 경로 문자에 대한 좀 더 고급 인코딩/디코딩을 수행하고 사용자를 대신하여 디코딩해야 할 수도 있습니다 나왔다.

1

다른 사람이 언급했듯이 문자열을 인코딩하면 먼저 문제가 발생합니다.

MVC 프레임 워크는 인코딩해야하지만 유효한 URL 문자 (예 : & %? * /)를 그대로두고 인코딩하는 문자입니다. 유효한 URL 문자이기 때문입니다. URL에 특수 문자가 있어도 결과가 정확하지 않을 수도 있기 때문입니다.

+1

시스템 사용 문자가 포함 된 문자를 인코딩하는 데 더 많은 이유가 있습니까? 실제 메소드가 수행해야하는 작업 (일부)을 이미 수행하는 매개 변수를 전달해야하는 이유는 없습니다. –

+0

시스템이 사용 되었기 때문에가 아니라 인코딩 된 URL 사양에 따라 유효한 문자가 아니기 때문입니다. 그러나 URL에서 의미를 정의하는 다른 문자는 완전히 유효하기 때문에 인코딩되지 않습니다. – Ady

0

나는 이것에 관해 비슷한 글을 보았다. 너무 나, MVC의 결함처럼 보입니다. 이 함수의 이름은 "BuildUrlFromEncodedExpression"입니다. 무엇보다 나쁜 것은 호출 된 함수가 입력 매개 변수를 디코딩해야한다는 것입니다. 수다.

BuildUrlFromExpression()으로 인코딩 된 문자와 호출자가 인코딩 한 문자 사이에 겹치는 부분이 있으면 (단순한 이유로 영숫자가 아닌 문자를 인코딩 할 수 있다고 생각합니다) 그러면 불쾌한 버그가 발생할 가능성이 있습니다.