2015-01-06 5 views
1

Глядя разрешить FORTIFY вывод (Path Manipulation) для разрешения открытия файла:Открыть FileStream для написания - подкрепиться Путь Манипуляция

public FileStream OpenFile(string directory, string filename) 
{ 
    FileStream fs = null; 
    string pathname = string.Empty; 
    pathname = Path.Combine(directory, filename); 
    fs = new FileStream(pathname , FileMode.OpenOrCreate); 
    return (fs); 
} 

Этот код работает в приложении .NET, но не написать виртуальный каталог.

Сопротивление/предложение Fortify указывает на то, что белый список действительных каталогов, но это равносильно жесткому кодированию каталогов в приложении. Это может быть безопасно, но это не хорошая практика программирования.

Заранее спасибо

+2

Если вы пытаетесь написать в виртуальный каталог на сервере, вам нужно будет найти способ использования 'Server.MapPath' и использовать'/path/path/etc. .' используйте косые черты, указывающие на ваше местоположение , например, если вы хотите записать в папку документов, вы бы выполнили 'fs.Write (Server.MapPath (" ~/Documents/SomeData.txt "))' – MethodMan

+0

также здесь 'pathname = Path.Combine (directory, filename);' вы можете сделать следующее: 'pathname = Path.Combine (каталог, Path.GetFileName (имя файла));' если вы только хотите вернуть FileName .. – MethodMan

+1

Can вы проясните «но НЕ пишите в виртуальный каталог». Заметим? Что вы хотите сделать - напишите в определенном месте на диске * вне * root из вашего приложения или получите этот код для записи * только * внутри корня вашего приложения? –

ответ

0

@James Никс предоставил правильный ответ, в комментарии:

Вы получаете этот вывод, поскольку этот метод принимает «пользователь при условии» путь и имя файла. Если злоумышленник должен был отправить этот метод параметрам directory=C:\Windows и filename=notepad.exe, они могли бы перезаписать notepad.exe с чем-то злонамеренным, если у вашего приложения были права на запись в этот файл. - James Nix 6 января в 17:17

Смежные вопросы