Предположим, что сервер приложений получает двоичный код с клиента и записывает его в файл на удаленном хосте.Как безопасно писать в удаленный файл с помощью Net :: OpenSSH
client -(HTTP)> application server -(SSH)> remote data host
Учитывая, что имя файла ввода пользователя приходит от клиента, то, что должно быть сделано на сервере (приложение) для защиты от атак (обходных атак)?
Учетная запись пользователя, используемая для подключения к удаленному хосту, имеет домашний каталог /home/datauser
и не должна иметь доступ к чему-либо за пределами своего дома.
Это код:
# User input
my $name = ...; # bob's car.jpg
my $dir = ...; # pics/vacation "country"/
# Slashes are illegal
die "Illegal dir" if ($dir =~ /\.\.\//); # ../ is an attack
die "Illegal name" if ($name =~ /\//); #/in file name is an attack
# Escape single quotes
my $safe_path = $dir.$name;
$safe_path =~ s/'/'\\''/g;
# my $ssh = Net::OpenSSH->new(...);
my $root_dir = '/home/datauseruser';
my $cmd =
"cd '$root_dir' && ".
"cat >>'$safe_path'";
$ssh->system({stdin_data => $bytes}, $cmd);
Является ли это хороший подход? Есть ли больше уязвимостей?
Примечание: требуется произвольный доступ, поэтому scp не может использоваться.
Спасибо - я не ожидал получить ответ от разработчика модуля, который я использую, это здорово! Net :: SFTP :: Foreign работает очень хорошо, особенно опция append. Он заботится обо всех побегах/цитатах красиво. Кстати, по какой-то причине put_content() жалуется, когда предоставляется опция append, но так как это всего лишь оболочка вокруг put(), использование put() напрямую работает (не уверен, почему). – c0xc