2012-11-02 2 views
1

다른 서버의 파일 공유에 매핑되는 가상 디렉터리 (/ ArticleImages)가 포함 된 dotnet 사이트가 있습니다. 파일 공유는 많은 사람들이 액세스 할 수 있으므로 보안 조치로이 폴더에서 asp.net 페이지를 실행하지 마십시오 (예 : 파일 공유에 default.aspx 넣기, site.com/ArticleImages 찾아보기 /default.aspx는 게재하지 말아야하며, 실행하지 않고 간단한 다운로드로 제공해야합니다.asp.net 페이지가 하위 폴더에서 실행되는 것을 방지

IIS 6.0을 사용하고 가상 디렉터리를 추가했습니다. 이 폴더에서 응용 프로그램을 제거하면 상위 응용 프로그램을 사용하고 web.config을 읽을 수 없다는 불만을 표시합니다. 이 폴더에 응용 프로그램을 추가하면 모든 응용 프로그램 확장을 제거하더라도 svc-xyzzy (공유에 액세스하는 데 사용 된 계정)에 'C : \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files '에 있습니다.

어떻게 dotnet 코드를 실행하지 않는 응용 프로그램의 하위 폴더가 있습니까?

당신은 요청 global.asax 확인하고 허용하지 디렉토리에서 오는 경우, 다음과 같이 처리를 중지 할 수 있습니다

답변

1

기본적으로 네트워크 서비스에서 응용 프로그램 풀이 실행중인 사용자가 파일 공유를 읽을 수있는 경우 가상 디렉터리를 완전히 제거하고 브라우저에 파일을 스트리밍 할 ASP.NET 응용 프로그램을 만들 수 있습니다. MVC를 사용하는 경우 단순히 파일 결과 만 반환합니다. 이렇게하면 사용자가 파일을 다운로드하지 못하도록 제한 할 수 있다는 이점이 있습니다. 즉, 사용자가 로그인했거나 파일을 다운로드 할 수있는 권한이 있어야합니다. 또한 통과 경로를 테스트했는지, 사용자가 ../../filename을 입력하여 허용되지 않는 파일을 다운로드하는 것을 원하지는 않을 것입니다.

옵션 1 : ASP.NET MVC

public ActionResult Download(string file) 
{ 
    // Check for directory traversal attack 
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1) 
    { 
     return new HttpNotFoundResult(); 
    } 

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file); 

    if(!System.IO.File.Exists(file)) 
    { 
     return new HttpNotFoundResult();     
    } 

    return this.File(file, GetMimeType(file)); 
} 

옵션 2 : 웹 양식 당신은 MVC 모두의 MIME 유형을 얻을 수있는 방법이 필요합니다

private void DownloadFile(string file) 
{ 
    // Check for directory traversal attack 
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1) 
    { 
     Response.StatusCode = 404; 
     Response.End(); 
    } 

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file); 

    if (!System.IO.File.Exists(file)) 
    { 
     Response.StatusCode = 404; 
     Response.End(); 
    } 

    Response.ContentType = GetMimeType(file); 
    Response.TransmitFile(file); 
} 

웹 양식 (MIME Type Method From KodeSharp)

private string GetMimeType(string fileName) 
{ 
    string mimeType = "application/unknown"; 
    string ext = System.IO.Path.GetExtension(fileName).ToLower(); 
    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
    if (regKey != null && regKey.GetValue("Content Type") != null) 
     mimeType = regKey.GetValue("Content Type").ToString(); 
    return mimeType; 
} 
0

: 물론

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    string cTheFile = HttpContext.Current.Request.Path; 

    if(cTheFile.StartsWith("/articleimages", StringComparison.CurrentCultureIgnoreCase) 
    { 
     HttpContext.Current.Response.TrySkipIisCustomErrors = true; 
     HttpContext.Current.Response.Write("Please start from home page"); 
     HttpContext.Current.Response.StatusCode = 403; 
     HttpContext.Current.Response.End(); 
     return ; 
    } 
} 

할 수 있습니다 디렉토리에 간단한 장소 하나 추가 web.config 이 내부 :

<configuration> 
    <system.web> 
     <authorization> 
     <deny users="*" /> 
     </authorization> 
    </system.web> 
</configuration> 

그러나 이러한 코드를 삭제할 수 있으면 코드로 유용하지 않습니다.

+0

.net은 루트 앱에서 와일드 카드 처리기로 설정되어 있으므로 코드에 필터를 설치해야하지만 작동 할 수 있습니다. 불행히도 web.config 옵션에 대한 편집/삭제 권한은 적합하지 않습니다. – Zarigani

+0

@ Zarigani 내가 입력 한 첫 번째 솔루션은 작업을 완료 할 것입니다. – Aristos

관련 문제