Реклама:

public void ProcessReauesl(HttpContext context) {

// Папка Content обычно находится в каталоге Config String contentPatn = @"c:\etc\content\"; // Провернем, пылn ли в < rpr„ -. wipui.a ум ли имя файл,, if (!string.IsNullOrEmpryt

context.Request.QueryStnngf "filename' ]))

<

// Конструирование имени файла и срывание файла string filename - context.Request.QueryString["filename"J; byte[] bytes = File.ReadAllBytes(contentPatri + filename), // Отображение диалогового окна загрузки context.Response.AddHeader(

"Content-Type", "binary/octet-stream"); context.Response.AddHeader(

"Content-Length", bytes.Length.ToString(J); context.Response.AddHeader(

"Content-Disposition". string.Format(

"attachment; filename={0); size={1)",

filename,

bytes.Length)); context. Response. BinaryWntef bytes); )

>

public bool IsReusable {

get { return false; }

}

)

Этот обработчик можно вызвать, например, таким способом; http://server/app/DownloadHandler.ashx?filename=document1.doc

Вы можете проследить, где были объединены каналы управления и данпых?* byte[] bytes = File.P,eadAllBytes(contentPath + имя_файла):

Опять-таки, вам приходится предоставлять contentPath, поскольку имя файла предоставлено пользователем. Вряд ли вам понравится, если пользователь сможет получить контроль над папкой и загружаемым файлом. Поэтому для загрузки в папку Content следует использовать механизм «песочница».

А что произойдет, если в качестве имени файла пользователь введет следующее: filename=../../inetpub/wwwroot/app/web.config

Он перехватит управление файлом и каталогом, куда производится загрузка.

Чаще всего эта проблема возникает при необходимости открыть ресурсы (файл) в приложении на основе данных, введенных пользователем. К тому же очень сложно проверить злонамеренное формирование имени ресурса, поскольку в операционной системе Microsoft Windows существует множество различных способов задать имя файла. В следующем списке приведено несколько вариаций адресации одного и того же файла:

■ c:\dir\foo\myfilenamc.txt;

■ c:\dir\foo\inyfile-l.txt;

■ c:\dir\foo\myfilename.txt;

■ c:\dir\foo\myfilename,txt::$DATA;

■ c:\dir\f(X)\filcs\sccrct\..\..\myfilename.txt;

■ c:\dir\foo\files\..\myfilename.txt;

■ c:\dir..\dir\foo\files\..\myfilcname.txt:

» \\localhost\cS\dir\foo\myfilcnamc.txt.

При использовании такой адресации проверки типа следующей становятся совершенно непригодными.

if (filename "web.config") // Отказ в доступе

Следует также помнить о том, что большое разнообразие разрешенных в Интернете кодировок позволяет использовать еще больше альтернатив для указания имени файла, например, последовательность точка, точка, косая черта (../) можно закодировать как .%2e%2f. Двойное кодирование этой последовательности символов выглядит еще забавнее. Двойное кодирование символа обратной косой черты (\) может выглядеть так:

■ %5с (стандартный UTF-8);


⇐ Предыдущая страница| |Следующая страница ⇒