остановить несанкционированную загрузку файлов в asp.net - PullRequest
0 голосов
/ 08 марта 2012

У меня есть страница login.aspx с пользовательским текстовым полем для имени пользователя и пароля, т. Е. Нет loginview
после ввода правильного имени пользователя и pwd я назначаю sessionid, который используется для посещения других страниц веб-сайта.

Теперь, чтобы загрузить file (1234), я переадресовываю пользователя на ~/download.aspx?fileid=1234, на этой странице я проверяю идентификатор сеанса и отправляю пользователя в файл url, т.е. ~/file/1234.pdf.
если кто-то прямо входит в URL файла, я не могу его остановить.
Пожалуйста, объясните мне, как это сделать ...

P.S. Я прочитал о authentication rule в web.config файле, но не знаю, как пометить пользователя как аутентифицированного, он вводит правильное имя пользователя и пароль при входе в систему. (я проверяю только имя пользователя и pwd из базы данных и перенаправляю на домашнюю страницу)

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Ваша стратегия аутентификации довольно слабая.Вы должны ограничивать области вашего сайта (в частности, каталогами файлов в данном случае) ролями и назначать им пользователей.

Однако, чтобы обойти более насущную проблему, просто отключите внешний мир от доступа ккаталог файлов, и когда они нажимают ~/download.aspx?fileid=1234, просто подайте им файл.Вы можете найти инструкции для этого здесь: Как правильно обслуживать файл PDF

1 голос
/ 08 марта 2012

Ниже приведен код, который я использую в своих проектах

void ServeFile(string fname, bool forceDownload)
{
 if(UserHasPermission(fname))
 {
  DownloadFile(fname,forceDownload);
 }
 else
 {
  ShowMessage("You have no permission");
 }
}

private void DownloadFile( string fname, bool forceDownload )
{
  string path = MapPath( fname );
  string name = Path.GetFileName( path );
  string ext = Path.GetExtension( path );
  string type = "";
  // set known types based on file extension  
  if ( ext != null )
  {
    switch( ext.ToLower() )
    {
    case ".htm":
    case ".html":
      type = "text/HTML";
      break;

    case ".txt":
      type = "text/plain";
      break;

    case ".doc":
    case ".rtf":
      type = "Application/msword";
      break;
    case ".pdf":
      type = "Application/pdf";
      break;
    }
  }
  if ( forceDownload )
  {
    Response.AppendHeader( "content-disposition",
        "attachment; filename=" + name );
  }
  if ( type != "" )   
    Response.ContentType = type;
  Response.WriteFile( path );
  Response.End();    
}
1 голос
/ 08 марта 2012

Взгляните на это - http://support.microsoft.com/kb/301240

Найдите пункт 4 в этой статье в разделе «Кодирование обработчика событий, чтобы он проверял учетные данные пользователя», в нем объясняется, как установить файл cookie для проверки подлинности после проверки пользователя

Код для просмотра:

FormsAuthenticationTicket tkt;
      string cookiestr;
      HttpCookie ck;
      tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
      cookiestr = FormsAuthentication.Encrypt(tkt);
      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
      if (chkPersistCookie.Checked)
      ck.Expires=tkt.Expiration;    
            ck.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Add(ck);

Что вы можете сделать:

1. Enable form authentication in web.config
2. deny anonymous access to downloads folder
3. When user authenticates, set authentication cookie and redirect user to download folder
4. download folder now can only be accessed by logged in user and id
...