【问题标题】:Replacing HTTP_GET_VARS but with what?替换 HTTP_GET_VARS 但用什么?
【发布时间】:2016-03-06 22:03:25
【问题描述】:

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

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

表单提交后代码如下:

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

【问题讨论】:

  • "后面的代码怎么从HTTP_GET_VARS知道这个?"是什么意思?为什么代码要“知道”变量的来源?

标签: php http variables get


【解决方案1】:

首先,这是非常不安全的代码,你有一个很好的 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);

【讨论】:

    【解决方案2】:

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

    如果您调用该 URL:

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

    你会得到这个变量:

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

    $_GET 是一个超全局的:这个数组适用于脚本的任何部分(函数、主程序、类等)

    【讨论】:

    • 好的,但是如果我把它改成这个它仍然不起作用:while( $xvar = each( $_GET ) )
    【解决方案3】:

    $_GET $_POST 和其他超全局变量在 php 中始终可用:

    http://php.net/manual/en/language.variables.superglobals.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2019-03-09
      • 2015-05-08
      • 1970-01-01
      • 2014-10-28
      • 2018-02-17
      • 2011-01-25
      相关资源
      最近更新 更多