2016-03-06 70 views
1

我正在使用遗留代码,对其进行更新。替换HTTP_GET_VARS但用什么?

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

表格后提交这是代码:

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

是什么_“如何后续代码HTTP_GET_VARS知道这一点? “_ 意思?为什么代码“知道”变量来自哪里? – CodeCaster

回答

1

$ _GET自动与所有的GET参数填充。

如果你调用网址:

test.php?param1=test&param2=ok&ert=true 

,你会得到这个变量:

$_GET['param1'] == 'test' 
$_GET['param2'] == 'ok' 
$_GET['ert'] == 'true' 

$ _GET是一个超全局变量:此数组可以是你的脚本(函数中的任何部分,主,类等)

+1

好的,但如果我改变它,它仍然不起作用:while($ xvar = each($ _GET)) –

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