Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用Net::OpenSSH安全地写入远程文件_Perl_Shell_Security_Ssh_Directory Traversal - Fatal编程技术网

Perl 如何使用Net::OpenSSH安全地写入远程文件

Perl 如何使用Net::OpenSSH安全地写入远程文件,perl,shell,security,ssh,directory-traversal,Perl,Shell,Security,Ssh,Directory Traversal,假设应用程序服务器从客户端接收到一个二进制blob,并将其写入远程主机上的文件 client -(HTTP)> application server -(SSH)> remote data host 如果文件名是来自客户端的用户输入,那么在(应用程序)服务器上必须做些什么来防止攻击(目录遍历攻击) 用于连接远程主机的用户帐户具有主目录/home/datauser,不应访问其主目录以外的任何内容 代码如下: # User input my $name = ...; # bob's c

假设应用程序服务器从客户端接收到一个二进制blob,并将其写入远程主机上的文件

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。

通过SSH连接发送内容的主要潜在安全问题是远程shell是不可避免的。换句话说,每次您要求SSH执行命令时,它实际上调用一个shell(
$LOGIN\u shell-c$CMD
),而不是只调用给定的命令(
@CMD
),因此必须正确引用命令参数

你已经在自己引用了,代码对我来说似乎是正确的。但无论如何,您可以让Net::OpenSSH为您做这件事,并且不必担心:

my $safe_path = $ssh->shell_quote($path);
$ssh->system("cat >>$safe_path");
最后,实际上,有一种方法可以避免shell:使用SFTP


Net::OpenSSH与Net::SFTP::Foreign集成,您可以使用它轻松访问远程文件系统。

谢谢-我没想到我正在使用的模块的开发人员会给我答案,太棒了!Net::SFTP::Foreign非常有效,尤其是append选项。它很好地处理了所有转义/引用。顺便说一句,出于某种原因,当提供append选项时,put_content()会抱怨,但由于它只是put()的包装器,因此直接使用put()是有效的(不确定为什么)。