2

我已经在 foreach 循环中动态地为 SELECT 查询构建了一个 MySQL WHERE 子句。$_GET数据来自一个包含许多选择列表的表单,每个选择列表都允许进行多项选择。

例如,如果提交了以下表单数据:

$_GET = Array (
  ['foo'] => Array ( [0] => a ) ,
  ['bar'] => Array ( [0] => b, [1] => c) ,
  ['foobar'] => Array ( [0] =>  '')
)

使用处理代码:

$whereinitialize = array();
$where = " ";
$whitelist = array ('foo', 'bar', 'foobar');
foreach ($_GET as $key => $values) {
  foreach ($values as $value) {
    $value = mysql_real_escape_string($value);
    $whereinitialize[$key] = isset($whereinitialize[$key]) ? $whereinitialize[$key] : false;
    if (in_array($key, $whitelist)) {
      if ($value == "") {
        $whereinitialize[$key] = "1"." OR ";
      } else {
        $whereinitialize[$key] .= ("$key = '$value'")." OR ";
      }
    }
  }
}
foreach ($whereinitialize as $v) {
  $where .= "(".(rtrim($v, " OR ")).")"." AND ";
}
$where = rtrim($where, " AND ");

我的 WHERE 子句 ( $where) 然后输出:

(foo = 'a') AND (bar = 'b' OR bar = 'c') AND (1)

从功能上讲,这对我的目的来说工作得很好,但是我已经阅读了各种帖子,表明超全局变量的动态处理充满了安全问题。所以我的问题是,考虑到使用白名单并使用 mysql_real_escape_string 转义数据,上面显示的表单处理动态代码是否可能比按照标准做法单独手动提取和清理每个值更具安全风险?(即$foo = $_GET[‘foo’]等)

4

1 回答 1

-1

我建议您使用 PDO 准备好的语句。不要再使用 mysql 函数,不仅 PDO 比简单的 mysql 有更多的功能,而且在较新版本的 PHP 中 mysql_* 函数将被弃用。

在 PDO 中,您可以使用准备好的语句,并且您不必担心 SQL 注入,因为您想要传递给数据库方法以便在数据库中对它们进行某事的参数将清理、转义和这类东西你,让生活更轻松。

这是 php 中 PDO 的链接:http: //php.net/manual/en/book.pdo.php ,这里是关于准备好的语句: http: //php.net/manual/en/pdo.prepared-statements .php

于 2013-06-09T15:28:33.393 回答