2

我的老板设置了一个脚本来通过 PHP 处理表单并将结果通过电子邮件发送。我们需要使用这个处理器。处理器的问题是这行代码:

foreach ($_POST as $k => $v){$$k = strip_tags($v);}

如果发送的所有值都只是字符串,这会很好,但我正在尝试处理一些作为数组传递的复选框。据我了解, strip_tags 函数仅适用于字符串。它处理所有内容并通过电子邮件发送结果,但每次尝试处理一系列复选框时都会发出通知。注意:数组到字符串的转换......这个过程仍然有效,我只是得到了到处都是丑陋的通知。为了临时解决问题,我删除了 strip_tags 函数,结果如下:

foreach ($_POST as $k => $v){$$k = $v;}

现在一切正常,我没有收到任何警告、错误或通知。但是,在向我的老板指出这一点后,他希望我恢复到原始代码,然后为每个复选框赋予其自己唯一的名称,而不是为它们赋予相同的名称和不同的值。我可以这样做,但我知道这不是处理一系列复选框的正确方法。此外,它还会引起各种头痛。我的老板根本不了解如何使用数组,所以他每次遇到数组时都会想出这样愚蠢的变通办法。他还声称这是某种垃圾邮件保护措施,可以阻止人们在我们的表单中添加收件人。我可能不是 PHP 专家,但我很确定这种说法是错误的。

那么我能做些什么来解决这个问题呢?我知道我应该首先将复选框数组转换为字符串,然后在生成的字符串上使用 strip_tags 函数,但我对 PHP 还是很陌生,并不完全理解那行代码开始做什么。任何人都可以帮助我至少指出正确的方向吗?

4

2 回答 2

2

向你的老板指出:

<input type="checkbox" name="valid_recipient[]" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient[]" value="x" /> nasty@badperson.com

<input type="checkbox" name="valid_recipient1" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient2" value="x" /> nasty@badperson.com

是相同的,无论它们是作为复选框值数组还是单个复选框/值对传递。不管怎样,Nasty 先生只是在你的复选框列表中注入了一些东西。

同样,设置的恶意用户是什么

<input type="hidden" name="_POST" value="haha I wiped your post array!" />

进入表格。您的 PHB 方便的花花公子“使我们完全安全”处理器刚刚愉快地对 $_POST 数组进行了核对,同时“完全安全”

于 2011-03-01T19:20:11.070 回答
0

将复选框作为数组传递是库什:

<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="myarray[key2]" value="well hello again" />

将创建一个结果 $_POST ,如:

Array
(
    [myarray] => Array
        (
            [key1] => hello world
            [key2] => well hello again
        )

)

虽然这很棒,但这也意味着你老板的代码是双重不安全的:

首先,没有strip_tags那里会使您容易受到 XSS 攻击。

其次,天真地信任$_POST变量名并将它们导出到全局命名空间是灾难的根源。(register_globals 成为过去是有原因的)。

例如,假设您使用一个简单的$_SESSION变量跟踪登录用户的用户名。像这样的东西:

if ($_SESSION['logged_in_user'] == 'admin') {
   // do administrator things
}

好吧,通过接受和导出$_POST变量,攻击者可以像这样修改 HTML 表单元素:

<input type="checkbox" name="myarray[key1]" value="hello world" />

并把它变成这样的东西(使用 Firebug 或 Chrome):

<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />

泰德-啊!任何匿名用户都可以获得对该网站的管理员访问权限。

这是一个简单的脚本供您考虑:

<pre>
<?php 
session_start();
$_SESSION['logged_in_user'] = 'pygorex1';
print_r($_SESSION);
foreach ($_POST as $k => $v) {
    $$k = $v;
}
?>
</pre>
<form method="post">
<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />
<input type="submit" value="go go gadget" />
</form>
<pre>
<?php 
print_r($_SESSION);
print_r($myarray);
session_write_close();

if ($_SESSION['logged_in_user'] == 'admin') {
    echo("OWNED\n");
}

?>
</pre>
于 2011-03-01T19:42:28.953 回答