..: Доступ к файлам. Как предоставить файл только зарегистрированному пользователю? :.. |
Автор: Федор Сойкин
Источник: GotDotNet.RU
Допустим, что файл хранится в недоступной пользователю
папке. И пользователю предоставляется подобным запросом:
http://site.ru/MyApp/GetFile.aspx?FileName=file.dat
Создадим HttpHandler:
public class MyHttpHandler : IHttpHandler { public bool IsReusable { get { return true; } } public void ProcessRequest( HttpContext context ) { string strRequestedFile = context.Request.QueryString[ "FileName" ]; FileStream stmFileStream = new FileStream( @"D:\MySecureFolder\"+ _
strRequestedFileName, FileMode.Open ); byte[] buffer = new byte[ stmFileStream.Length ]; stmFileStream.Read( buffer, 0, buffer.Length ); stmFileStream.Close(); context.Response.ContentType = "application/octet-stream"; context.Response.OutputStream.Write( buffer, 0, buffer.Length ); } }
Затем, в web.config, укажем:
<configuration> <system.web> <httpHandlers> <add verb="GET" path="GetFile.aspx" type="MyHttpHandler, MyAssembly"/> </httpHandlers> </system.web> </configuration>
При использовании приведенной выше информации, следует
учитывать:
- Необходимо проверять имя файла в запросе. В
приведенном примере злоумышленник может использовать в
запросе конструкции типа "..\..\" и, таким образом,
потенциальную возможность получить несанкционированный
доступ к ресурсам сервера.
- Свойство Response.ContentType. Его значение зависит от
того, что Вы собираетесь передавать.
- Необходимо обрабатывать исключения, связанные с
открытием файла. Стоит подумать о размещении операторов
работы с файлом в using-блоке.
- Следует учитывать размер данных передаваемых клиенту. В
случае если размер значительный, стоит передавать данные не
целиком, а частями.
- Свойство IsReusable указывает среде исполнения на
возможность повторного использования
обработчика запросов. То есть, когда придет следующий
запрос, среда не будет создавать новый объект MyHttpHandler,
а использует этот-же повторно.
- Элемент "httpHandlers/add" добавляет обработчик
HTTP-запросов. В данном случае все GET-запросы на файл
GetFile.aspx будут перенаправляться указанному обработчику.
И не важно, существует ли этот файл на самом
деле.
При перепечатке любого материала с журнала или с сайта,
видимая ссылка на источник
http://altwebdeveloper.nm.ru
и все имена, ссылки авторов обязательны.
© 2004 CAS "altDesign"
© Валерий В. Макеев (deepInfinity)
|