Php 文件名可以是代码注入的吗
我的PHP web应用程序解析传入的电子邮件并将其存储在MySQL表中。在解析电子邮件内容后,我使用MySQL准备的语句存储不同的电子邮件部分,如“to”、“From”、“Subject”、“Body”等,以防止任何代码注入 如果电子邮件有附件,我需要将其存储在文件夹中,如果使用PGP加密,则需要通过PGP EXEC函数运行gpg external命令 此文件处理似乎是可注入代码的,即,如果有人调用附件,例如: “mydoc.doc mysqldump\u到www\u根目录和格式\u所有分区” 也许我错了。为了防止出现这种情况,我决定在创建文件后立即检查文件是否存在,如下所示: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所有分区”
//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”)来修复。所以现在一切都很好,谢谢!