Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Php 文件名可以是代码注入的吗_Php_File - Fatal编程技术网

Php 文件名可以是代码注入的吗

Php 文件名可以是代码注入的吗,php,file,Php,File,我的PHP web应用程序解析传入的电子邮件并将其存储在MySQL表中。在解析电子邮件内容后,我使用MySQL准备的语句存储不同的电子邮件部分,如“to”、“From”、“Subject”、“Body”等,以防止任何代码注入 如果电子邮件有附件,我需要将其存储在文件夹中,如果使用PGP加密,则需要通过PGP EXEC函数运行gpg external命令 此文件处理似乎是可注入代码的,即,如果有人调用附件,例如: “mydoc.doc mysqldump\u到www\u根目录和格式\u所有分区”

我的PHP web应用程序解析传入的电子邮件并将其存储在MySQL表中。在解析电子邮件内容后,我使用MySQL准备的语句存储不同的电子邮件部分,如“to”、“From”、“Subject”、“Body”等,以防止任何代码注入

如果电子邮件有附件,我需要将其存储在文件夹中,如果使用PGP加密,则需要通过PGP EXEC函数运行gpg external命令

此文件处理似乎是可注入代码的,即,如果有人调用附件,例如:

“mydoc.doc mysqldump\u到www\u根目录和格式\u所有分区”

也许我错了。为了防止出现这种情况,我决定在创建文件后立即检查文件是否存在,如下所示:

//Here I save the file to a folder
$filename = $attachment->filename;
if ($fp = fopen($save_dir.$filename, 'w')) {
    while($bytes = $attachment->read()) {
      fwrite($fp, $bytes);
    }
    fclose($fp);
}

//Here I check for injection
If(!is_file($attach_dir.'/'.$filename)) {
    // something wrong, do not proceed
}
我的操作系统是带有EXT4文件系统的Ubuntu。那个shceme会不会让我避免在电子邮件文件附件中可能的代码注入?如果最终我想做以下事情,我需要首先担心吗?例如:

$cmd = "gpg --passphrase *** '$attachedir/$filename'";
exec($cmd, $output);

换句话说,将文件存储到磁盘是否会清理/过滤文件名,或者可能会出现异常?

PHP有一个函数,可以在字符串中转义shell元字符,以确保它被视为单个参数,而不是一组参数或单独的命令。在生成传递给
exec()

的命令字符串时,在文件名上使用此选项,为什么不将文件名更改为随机字符串,并在数据库中同时存储原始名称和随机字符串?@ChrisForrence如果原始名称包含不需要的代码怎么办?那么不需要的代码将作为字符串无害地存储在数据库表的“原始文件名”列中。你说你使用准备好的语句来避免SQL注入,这是正确的做法。哦,对了!任何东西都是可注入的,如果您允许外部数据在可执行的上下文中使用,或者可以直接影响执行
$foo=$\u GET['hackme']
是完全无害的。做
eval($foo)
right afterwords是完全疯狂的$exec($cmd,$output)当这个escapeshellarg进入gpg bash命令行时,我得到一个错误:(对,因为这不是调用函数,它只是在字符串文本中写入单词“escapeshellarg”。使用
“gpg--passphrase****”。escapeshellarg($attachedir./“$filename)
。谢谢,你说得对!但是它会吃掉非ASCII字符,也就是说,如果我的文件名中有俄文字母被跳过,我发现这是escapeshellarg()的一种错误,它通过设置setlocale(LC_CTYPE,“ru_ru.UTF-8”)来修复。所以现在一切都很好,谢谢!