문제

ASP.NET를 위해 미디어를 보호하는 좋은 관행을 알고 있습니까?

특정 이미지/비디오를 볼 수있는 권한이 필요한 다양한 미디어를 호스팅해야합니다. 즉, 특정 사용자는 미디어 파일을 볼 수있는 권한이 있거나 없을 수도 있습니다.이 사실은 즉시 변경 될 수 있습니다.

그들이 액세스 할 수있는 미디어 파일을 다운로드 할 수 있는지 상관하지 않으며, 액세스 할 수없는 항목을 알고 싶어하지 않습니다.

나는 이미 URL 난독 화를 고려했다 - 이것은 나에게 꽤 절름발이 보인다.

나는 인증 된 사용자를 형성했습니다 (그리고 이것을 기꺼이 바꾸지 않을 것입니다).

미디어 파일 폴더 구조를 권한과 무관하게 유지하고 싶습니다.

도움이 되었습니까?

해결책

모든 미디어에 액세스 해야하는 httphandler를 구축하십시오. 그런 다음 파일을 검색하고 사용자에게 보내기 전에 원하는 유효성 검사를 수행 할 수 있습니다. 모든 미디어를 메인 WWWROOT 경로 외부에 유지하거나 권한을 사용하여 해당 폴더에 대한 액세스를 거부하십시오.

이 주제에 대한 자세한 정보는 다음과 같습니다.

http://www.15seconds.com/issue/020417.htm

다른 팁

파일에 액세스 할 수있는 사용자/그룹을 설정하기 위해 이와 같은 XML 파일을 사용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name="file.doc" users="155,321" groups="grp5" />
    <file name="file2.doc" users="321" groups="" />
</root>

파일은 HTTP 루트 위에 저장되므로 URL에서 액세스 할 수 없습니다.

사용자가 getfile.aspx? file = file.doc에 액세스하려고 할 때 XML을로드하고 라인을 가져옵니다.

XmlNode xnFile= XML.GetElementById(wantedFile);

, 그런 다음 함수를 호출합니다

 HasAccess(Context.User, xnFile); 

사용자가 로그인한지 확인하고 권한을 비교 하고이 사용자가 파일을 갖는 것이 좋으면 디스크에서 파일을 읽고 기록합니다.

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

실제로 지금은 천 개가 넘는 파일이 있으며 XML이 5 년 동안 두 번 부패했을 때 파일 데이터를 데이터베이스에 작성하는 것이 좋습니다.

Spikolynn 답변에서 귀하의 의견에서

나는 당황했다 - 이것은 난독 화와 어떻게 다른가요? 인증 된 사용자가 다른 인증이지만 무단 사용자와 이미지를 공유 할 수 있습니까?

나는 당신이 시도하는 것 같아요 무단을 방지하십시오 나누는 미디어의.

이것은 많은 회사 (Microsoft, Apple, IBM 등)가 해결하기 위해 상당한 금액을 투자 한 것입니다. 해결책은 DRM이었다, 그리고 지금 그들은 그것을 제거하고 있습니다 실패했습니다.

그래서 내 대답은 당신입니다 공유를 방해 할 수 없습니다 사용자가 그것을 피하기 위해 약간의 노력을 기울여야한다면.

당신은 그냥 할 수 있습니다 정직한 사람들을 정직하게 유지하십시오 몇 가지 기술을 적용함으로써 Spikolynn 또는 멍청한 그들의 대답으로 설명하십시오.

각 사용자가 액세스 할 수있는 파일을 보유하는 테이블을 제안합니다.

UserID int
FileID varchar

그런 다음 파일 테이블 :

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

하드 드라이브에서 파일의 이름을 fileId (고유 한 식별기)와 FilEtype (확장자, 예를 들어 .jpg)로 지정하십시오. 권한 테이블의 FileID는 다른 테이블에서 생성 된 고유 식별기를 보유합니다.

사용자가 다른 파일의 이름을 추측 할 수 없다는 상대적 안전을 통해 URL을 통해이를 전달할 수 있습니다.

업데이트 : 그건 그렇고, 이것은 많이 httphandler를 작성하거나 파일 권한을 다루는 것보다 간단합니다. 그러나 누군가가 다른 파일 이름을 추측 할 가능성은 무한이지만 한 사용자가 다른 사용자가 파일에 액세스 할 수 있으므로 밀폐 보안이 아닙니다.

BrownpaperPackage.aspx? id = {Guid}

Media.aspx의로드 이벤트에서 사용자가 인증 된 것으로 확인한 다음 사용자가 미디어를 볼 권리가 있는지 확인한 다음 미디어를 스트림으로로드하여 페이지의 응답으로 공급합니다. Spikolynn 시연.

왜 이런 식으로합니까? 코드가 간단하고 ASP.NET 및 IIS 인증 서비스의 모든 이점을 얻을 수 있으며, 이로 인해 미디어를 요청하는 사용자를 찾을 수 있습니다. 해당 사용자를 미디어 객체의 액세스 목록에 매핑하는 것은 사소한 일입니다. 그리고 페이지에는 바로 요청 객체가 있습니다. 또한 미디어의 이름을 숨기고 있으므로 URL에서 무슨 일이 일어나고 있는지 알 수 없습니다.

사람들이 미디어에 직접 액세스하지 못하게하려면 어떻게해야합니까? 미디어 파일은 IIS 가상 디렉토리에 저장 될 수 없습니다. 그들이 있다면, 직접 다운로드 할 수있는 가능성이 있습니다. 데이터베이스에 바이트 어레이 (BLOB)로 저장하거나 웹 가상 디렉토리 외부의 디스크에 저장할 수 있습니다. 사용자는 파일에 액세스하려면 ASP.NET을 통과해야합니다

어떤 사용자가 어떤 미디어에 액세스 할 수 있는지 추적합니까? 사용자를 추적합니다. Thorugh ASP.NET 멤버십. 즉, 각 사용자는 aspnet_users 테이블에 ID가 있습니다. ID와 파일 이름 (또는 실제 미디어가 포함 된 블로브)이있는 미디어 테이블을 만듭니다. 그런 다음 둘을 연결하는 세 번째 테이블 만 만들면됩니다. 이 테이블에는 사용자 ID와 미디어 ID가 포함되어 있어이 사용자 가이 미디어를 볼 수 있음을 나타냅니다. 사용자 ID (ASP.NET 멤버십) 및 Media ID (URL)를 사용하면

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl

카운트> 0이면 사용자가 미디어를 볼 수 있습니다.

URL 사용 방법의 예 :

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top