我正在处理遗留代码,并对其进行更新。
这是一次删除多个条目的表单的一部分。
提交表单后,这是代码:
else{
//$msgcheck = db_query("DELETE FROM Comments WHERE ID = '$thisid'");
while( $xvar = each( $HTTP_GET_VARS ) )
{
//print $HTTP_GET_VARS[$myvarname];
$myqrystr = "DELETE FROM Comments WHERE ID = '" . $xvar["value"] . "'";
$msgcheck = db_query($myqrystr);
}
我不知道的是这是如何工作的?从注释代码中可以看出变量是$ thisid - 但是后续代码如何从HTTP_GET_VARS中知道这个?我知道我应该使用$ _GET,但变量在哪里?
答案 0 :(得分:2)
首先,这是一个非常不安全的代码,你内部有一个很好的SQL注入。
此代码遍历$HTTP_GET_VARS
数组并为每个可用参数运行删除查询,您可以对$_GET
执行相同操作,但循环每个参数实际上是一种不好的做法。
在这里,我认为其中一个查询字符串参数应该是一个数组,带有一个值键(在请求中类似?foo[value]=42
),这个参数将使delete-42-query其他参数(不是数组)将会生成通知(或警告)并以DELETE FROM Comments WHERE ID = ''
结尾,不删除任何内容。
首先,检查对此函数真正做出的查询(找到foo
参数的名称。
这里的SQL注入可能是这样的:
?foo[value]=' or '1'='1
:删除每一行?foo[value]='; DROP table user where '1'='1
最后代码应该是这样的:
如果您有数字标识符(总是更好):
$arg = $_GET['foo'];
$id = (int) $arg['value']; //<--- no more injection
$myqrystr = "DELETE FROM Comments WHERE ID = " . $id ;
$msgcheck = db_query($myqrystr);
如果您没有数字标识符,则需要将此id添加为查询参数。我看到db_query,可能有一种方法可以为这个函数添加参数,取决于库,如果它是drupal,它会是这样的:
$arg = $_GET['foo'];
$id = $arg['value'];
$myqrystr = "DELETE FROM Comments WHERE ID = :id";
$dbargs = array(':id' => $id)
$msgcheck = db_query($myqrystr, $dbargs);
答案 1 :(得分:1)
$ _ GET会自动填充所有GET参数。
如果您拨打该网址:
test.php?param1=test¶m2=ok&ert=true
你会得到这个变量:
$_GET['param1'] == 'test'
$_GET['param2'] == 'ok'
$_GET['ert'] == 'true'
$ _ GET是一个超全局:这个数组可用于你脚本的任何部分(函数,主要,类等)。
答案 2 :(得分:0)
$ _ GET $ _ POST 和其他超全局总是在PHP中可用:
http://php.net/manual/en/language.variables.superglobals.php