2011-03-01 64 views
2

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

我找到变量变量更糟... – 2011-03-01 19:13:46

+4

时候退出目前的工作;)的代码,一行讲述了贵公司的一切。 – NikiC 2011-03-01 19:14:50

+0

转动魔术引号;那么你就不需要去掉所有的标签了。 – 2011-03-01 19:18:55

回答

2

点出你的上司说:

<input type="checkbox" name="valid_recipient[]" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient[]" value="x" /> [email protected] 

<input type="checkbox" name="valid_recipient1" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient2" value="x" /> [email protected] 

是一样的,也与它们是否为复选框值,或单个复选框/值对的数组传递。无论哪种方式,Nasty先生只是在你的复选框列表中注入了一些东西。

而且,什么是从设置

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

到形式的恶意用户。您的PHB的方便的花花公子“让我们完全安全的”处理器刚刚兴高采烈地核爆$ _POST数组,同时还能被“完全安全”

+1

+1最后一部分;) – NikiC 2011-03-01 19:34:12

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 
     ) 

) 

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

首先,不具有那里的会让你容易受到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-ah!任何匿名用户都可以获得管理员访问该网站的权限。

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

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