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