2015-04-19 6 views
2

Предположим, что сервер приложений получает двоичный код с клиента и записывает его в файл на удаленном хосте.Как безопасно писать в удаленный файл с помощью 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 не может использоваться.

ответ

0

Проблема потенциальной безопасности мэра с отправкой вещей через соединение SSH заключается в том, что удаленная оболочка неизбежна. Другими словами, каждый раз, когда вы просите SSH выполнить команду, а не только fork+exec 'в данной команде (@CMD), она на самом деле вызывает оболочку ($LOGIN_SHELL -c $CMD), поэтому аргументы команды должны быть правильно процитированы.

Вы уже делаете цитирование самостоятельно, и код кажется правильным для меня. Но в любом случае, вы можете позволить Net :: OpenSSH сделать это для вас, и есть что-то меньше беспокоиться о:

my $safe_path = $ssh->shell_quote($path); 
$ssh->system("cat >>$safe_path"); 

Наконец, на самом деле, есть способ избежать оболочки: с помощью SFTP.

Net :: OpenSSH интегрирован с Net :: SFTP :: Foreign, который вы можете легко использовать для доступа к удаленной файловой системе.

+1

Спасибо - я не ожидал получить ответ от разработчика модуля, который я использую, это здорово! Net :: SFTP :: Foreign работает очень хорошо, особенно опция append. Он заботится обо всех побегах/цитатах красиво. Кстати, по какой-то причине put_content() жалуется, когда предоставляется опция append, но так как это всего лишь оболочка вокруг put(), использование put() напрямую работает (не уверен, почему). – c0xc

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

  • Нет связанных вопросов^_^