使用PHP处理复选框

时间:2011-03-01 19:10:07

标签: php email email-processing

我的老板设置了一个脚本来通过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,并且不完全理解该行代码正在做什么。任何人都可以帮助至少指出我正确的方向吗?

2 个答案:

答案 0 :(得分: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阵列,同时“完全安全”

答案 1 :(得分:0)

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

<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" />

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

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

<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>
相关问题