0

我问这个问题是因为我仍然不太确定过滤 $_GET 变量是否足以防止 mysql 注入,所以起初我有一个过滤功能

function filter_url($url)
{
  if (is_array($url))
  {
    foreach ($url as $key => $value)
    {
      // recurssion
      $url[$key] = filter_url($value);
    }
    return $url;
  }
  else
  {
    // remove everything except for a-ZA-Z0-9_.-&=
    $url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
    return $url;
  }
}

$_GET=filter_url($_GET);每次打电话之前都有

$filter_case =isset($_GET['product_ID'])?"and product_ID={$_GET['product_ID']}":"";

我需要做$mysqli->real_escape_string($_GET['product_ID'])吗?如果我还是要暗示的话,什么样的sql注入会越过我的查询方法呢?

此外,重要的$mysqli->real_escape_string($_SESSION['member_ID'])是我在想是否有人可以操纵他的$_SESSION 变量?

4

1 回答 1

0

这本质上是一个错误的问题。

$mysqli->real_escape_string 在将字符串文字添加到 SQL 查询中时需要。在这种情况下,无论字符串来源或验证如何,您都需要此函数。在任何其他情况下(即字符串不在查询中或不作为 SQL 字符串)这个函数将是绝对没用的。

这就是为什么必须使用准备好的语句,无论是原生的还是模拟的。

于 2013-08-07T12:56:50.440 回答