php - 用什么替换 HTTP_GET_VARS?

标签 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,但是变量是从哪里来的呢?

最佳答案

首先,这是高度不安全的代码,你在里面有一个很好的 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/

相关文章:

PHP 更新 MySQL 数据库表

Angular 2 404 - 无法使用 http get 读取 json 文件

javascript - 一成不变是什么意思?

django-piston:DELETE 处理程序中的 request.data 可用性

http - Location header 是否接受//协议(protocol)表示法?

php - 删除转义字符

jquery,向元素添加变量?

php - 根据日期创建主键

php - 在 PHP 脚本执行期间处理互联网连接崩溃的最佳方法

php - 如何使用 Twitter V2 API 调用电话