我正在处理遗留代码,更新它。
这是一次性删除多个条目的表单的一部分。
提交表单后,这是代码:
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,但是变量是从哪里来的呢?
最佳答案
首先,这是高度不安全的代码,你在里面有一个很好的 SQL 注入(inject)。
此代码遍历 $HTTP_GET_VARS
数组并对每个可用参数运行删除查询,您可以对 $_GET
执行相同的操作,但循环每个参数是真的是一个不好的做法。
在这里我认为查询字符串参数之一应该是一个数组,带有一个值键(请求中的 ?foo[value]=42
之类的东西)并且这个参数将使 delete-42-query其他不是数组的参数将生成通知(或警告)并以 DELETE FROM Comments WHERE ID = ''
结束,它不会删除任何内容。
所以首先,检查这个函数真正做了什么查询(找到 foo
参数的名称。
这里的 SQL 注入(inject)可能是这样的:
?foo[value]=' or '1'='1
:删除每一行?foo[value]='; DROP 表用户 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);
关于php - 用什么替换 HTTP_GET_VARS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833162/