2010-03-25 6 views

답변

5

이, 아니, 그것은 안전하지 : 당신은 쿠키의 모든 일하려면이 같은 코드로 사용자 정의 IHttpModule을 만드는 것이 좋습니다 (또는 global.asax.cs 확장) "응용 프로그램 범위". 쿠키 경로를 사용하는 것은 IE 및 Chrome에서는 대소 문자를 구분하지만 FF는 아니기 때문에 문제가 많습니다. 즉, 경로의 불일치가 발생하면 문제가 발생할 수 있습니다.

  1. 쿠키를 생성 할 때 설정 한 경로가 사용자가 입력 한 것과 다른 경우 브라우저는 저장하지 않습니다.

  2. 사용자가 반환 할 때 입력 한 경로가 첫 번째 여행과 다른 경우 브라우저는 쿠키를 요청에 제공하지 않습니다.

어떤 문제를 해결 하시겠습니까?

+0

나는 그것이 지금 왜 필요한지 잘 모르겠습니다. 같은 Jorn 설명한, 해당 쿠키 경로 및 asp.net 모듈 (또는 외부 asp.net 세계 대체) 같은 도메인에서 실행할 수있는 동일한 웹 응용 프로그램의 여러 인스턴스를 허용 할 수 있습니까? –

+0

ID를 통해 사용자 세션을 고유하게 식별하여 상태를 저장해야하는 경우 앱이 무경계 단일 쿠키를 공유 할 수 있습니다. id는 메모리 또는 DB의 값을 검색하는 데 사용되며, 쿠키가 누락 된 경우 쿠키를 발급하거나 응용 프로그램이 ID를 인식하지 못하면 새 항목을 할당합니다. 이 방법은 효과가 있지만 메모리 또는 DB 공간을 이전 값으로 사용하므로 주기적으로 정리할 것을 고려해야합니다. – Will

2

을 알고 싶어요. 따라서 코드에 따라 쿠키의 경로는 //이됩니다. 당신은이 작업을 수행하여이 문제를 피할 수 있습니다 응용 프로그램 (즉, 자신의 동등한 소문자로 대문자를 포함하는 URL의 모든 요청을 리디렉션)의 URL의 일관된 케이스를 적용하는 것이

cookie.Path = Request.ApplicationPath; 
if (cookie.Path.Length > 1) cookie.Path += '/'; 

Will correctly points out, 당신은 있는지 확인하는 것이 좋습니다 .

그 외에도, 나는이 일을 잘해야한다고 생각합니다. 한마디로

private void Application_EndRequest(object sender, EventArgs e) 
{ 
    var app = (HttpApplication)sender; 

    var cookiePath = app.Request.ApplicationPath; 
    if (cookiePath.Length > 1) cookiePath += '/'; 

    foreach (string name in app.Response.Cookies.AllKeys) 
    { 
     var cookie = app.Response.Cookies[name]; 
     cookie.Path = cookiePath; 
    } 
} 
+0

리디렉션은 POST가 아닌 경우에만 가능하므로 개발자는 소문자 * all * URL을 신중하게 사용해야하며 IIS의 가상 폴더 인 ApplicationPath가 해당 URL로 구성됩니다. 하지만 대부분의 문제는 대소 문자가 혼합 된 URL을 소문자로 리디렉션하여 완화 할 수 있으며이를 위해 HttpModule을 사용하는 것이 가장 좋습니다. 심지어는 잃어 버렸을 것 같은 혼합 된 케이스의 쿠키를 읽거나 설정해야하는 혼합 된 케이스의 URL에 시도 된 POST가 실패 할 때까지 계속 진행할 것입니다. – Will

1

아니요, 지정된 이유 때문에 안전하지 않습니다.

하지만 ... 귀하의 의도를 충족 시키려면 this technique을 고용하고 싶을 수 있습니다.

관련 문제