用PHP处理复选框

用PHP处理复选框,php,email,email-processing,Php,Email,Email Processing,我的老板建立了一个脚本,通过PHP处理表单并通过电子邮件发送结果。我们必须使用这个处理器。处理器的问题在于这一行代码: foreach ($_POST as $k => $v){$$k = strip_tags($v);} <pre> <?php session_start(); $_SESSION['logged_in_user'] = 'pygorex1'; print_r($_SESSION); foreach ($_POST as $k => $v) {

我的老板建立了一个脚本,通过PHP处理表单并通过电子邮件发送结果。我们必须使用这个处理器。处理器的问题在于这一行代码:

foreach ($_POST as $k => $v){$$k = strip_tags($v);}
<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>
如果发送的所有值都只是字符串,这将很好,但我正在尝试处理一些作为数组传递的复选框。据我所知,strip_tags函数仅适用于字符串。它处理所有事情并通过电子邮件发送结果,但每次尝试处理一系列复选框时都会抛出通知。 注意:数组到字符串的转换。。。 这个过程仍然有效,我只是收到了到处都是丑陋的通知。为了暂时解决该问题,我删除了strip_tags函数,结果如下:

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


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

向你的老板指出:

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

fred@example.com
nasty@badperson.com
都是一样的,无论它们是作为复选框值数组传递,还是作为单个复选框/值对传递。不管怎样,斯迪西先生只是在你的复选框列表中注入了一些东西

另外,恶意用户的设置是什么

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


进入表格。您的PHB的得心应手的花花公子“使我们完全安全”处理器刚刚愉快地核化了$\u POST阵列,而所有这些都是“完全安全的”

作为一个数组传递复选框:

<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="myarray[key2]" value="well hello again" />
虽然这很可怕,但也意味着你的老板代码是双重不安全的:

首先,没有
strip_标记
会使您容易受到XSS攻击

其次,天真地信任
$\u POST
变量名并将其导出到全局名称空间会导致灾难。(register_globals成为过去是有原因的)

例如,假设您使用一个简单的
$\u SESSION
变量跟踪登录用户的用户名。大概是这样的:

if ($_SESSION['logged_in_user'] == 'admin') {
   // do administrator things
}
<input type="checkbox" name="myarray[key1]" value="hello world" />
通过接受和导出
$\u POST
变量,攻击者可以修改如下HTML表单元素:

if ($_SESSION['logged_in_user'] == 'admin') {
   // do administrator things
}
<input type="checkbox" name="myarray[key1]" value="hello world" />

并将其旋转成这样(使用Firebug或Chrome):


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

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



我发现这些变量更糟糕……是时候辞职了;)这一行代码告诉了你公司的一切;那你就不需要再去掉所有的标签了。
我的老板根本不懂如何使用数组
-那他怎么会在编程相关领域找到工作呢?这就像说我的老板也是一名汽车修理工,但他不知道如何转动扳手——所以我们让他来修理客户的汽车。@tandu,什么?带标签删除引号的是什么?
<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>