用什么替换HTTP_GET_VARS?

时间:2016-03-06 22:03:25

标签: php http variables get

我正在处理遗留代码,并对其进行更新。

这是一次删除多个条目的表单的一部分。

提交表单后,这是代码:

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,但变量在哪里?

3 个答案:

答案 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&param2=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