我正在检查我的脚本是否存在漏洞,并且过去曾经做过非常不安全的事情感到震惊:
foreach ($_GET as $key => $value){
$$key = $value;
}
或更短
extract( $_GET );
我用firebug改变了一些POST / GET变量,以匹配我在脚本中使用的名称。如果名称被正确猜测,则可以覆盖。
所以我认为我必须单独命名,如下所示: $ allowed_vars =
$allowed_vars = array("time","hotfile","netload","megaupload","user","pfda","xyz","sara","amount_needed");
foreach ($_GET as $key => $value)
{
if (in_array($key,$allowed_vars))
{
$$key = $value;
}
}
这种方式比单独命名它们节省了一些时间。
必须使用什么样的自动化?
答案 0 :(得分:4)
我不使用任何类型的自动装置 我认为自动将请求变量分配给全局变量没有意义 如果它是一个或两个变量,我可以手动处理它们 如果有更多,我宁愿把它们作为数组成员保存,以方便处理。
然而,我正在使用某种类似于你的白名单方法。 但不是要从POST数据中创建全局变量,而是将该数据添加到SQL查询中。
就像在这个简单的辅助函数中生成SET语句一样:
function dbSet($fields) {
$set='';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
}
}
return substr($set, 0, -2);
}
$id = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$query = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";
答案 1 :(得分:3)
你可以节省更多的时间,完全没有提供它们。只需从$ _GET数组中使用它们。这样做的好处不仅在于避免与脚本变量冲突(或更糟),而且在添加请求参数时也不必更新“自动化”。
当我使用POST数据时,从表单开始,我经常明确地处理每个数据:
$data = array();
$data['field1'] = someSaniFunction($_POST['field1']);
$data['field2'] = someOtherFunction($_POST['field2']);
...
通过这种方式,我确保每个字段都得到妥善处理,并且只触及我期望的字段。
答案 2 :(得分:0)
根据我的经验,你不应该使用$_REQUEST
将$$
数组中的数据转换为变量,因为它可以覆盖当前范围内保存的变量。
相反,您应该考虑使用请求对象或数组来过滤数据,并且只访问您需要的命名变量。这样,您不必继续扩展允许的变量名称并仍然保持安全性。
例如,ZF有一个请求对象,他们建议在处理这些数据时使用输入过滤器: http://framework.zend.com/manual/en/zend.filter.input.html
答案 3 :(得分:0)