文件名是否可以代码注入

时间:2014-03-04 19:33:58

标签: php file

我的PHP Web应用程序解析传入的电子邮件并将其存储在MySQL表中。在解析了电子邮件内容后,我使用MySQL预处理语句来存储不同的电子邮件部分,例如" To"," From"," Subject"," Body&# 34;等,以防止任何代码注入。

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

这个文件处理似乎是代码可注入的,即如果有人称之为类似的东西:

" mydoc.doc mysqldump_to_www_root and_format_all_partitions"

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

//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);

换句话说,将文件存储到磁盘清理/过滤文件名还是可以有例外?

1 个答案:

答案 0 :(得分:1)

PHP有一个escapeshellarg()函数可以转义字符串中的shell元字符,以确保它被视为单个参数,而不是一组参数或单独的命令。在构建传递给exec()的命令字符串时,在文件名上使用此命令。