PHP:为所有 _GET 美元和 _POST 美元添加报价是个好主意吗?


PHP: Is it a good idea to add quotes to all $_GET & $_POST?

在Wordpress中,我注意到他们有一个名为wp_magic_quotes()(docs)的函数。

下面是一个示例:

// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
    $_GET    = stripslashes_deep( $_GET    );
    $_POST   = stripslashes_deep( $_POST   );
    $_COOKIE = stripslashes_deep( $_COOKIE );
}
// Escape with wpdb.
$_GET    = add_magic_quotes( $_GET    );
$_POST   = add_magic_quotes( $_POST   );
$_COOKIE = add_magic_quotes( $_COOKIE );
$_SERVER = add_magic_quotes( $_SERVER );

在我自己的代码(与Wordpress分开)中,这样做有什么好处吗?有什么安全优势吗?

也许Wordpress这样做是因为他们的软件在很多环境中使用,他们需要使它们保持一致。

我的软件在单个环境中,并且我正在为已经转义数据的数据库使用 PDO 连接。

我只是想弄清楚做这种事情是否有任何好处。

全局变量上的魔术引号通常是惰性安全性,并会导致更严重的问题。 我猜 WordPress 添加了它们,因为他们不信任插件编写者对输入进行适当的清理;或者他们有很多旧代码,希望magic_quotes被打开。

处理来自用户的全局数组输入的正确方法是尽可能严格地专门过滤每个数组。 因此,如果您有:

<select name="number">
  <option value="1">Thing 1</option>
  <option value="2">Thing 2</option>
  <option value="3">Thing 3</option>
</select>

您应该将其过滤为介于 1 和 3 之间的整数。

$_SAFE = array();
$_SAFE['number'] = filter_var($_POST['number'], FILTER_SANITIZE_NUMBER_INT);
if($_SAFE['number'] < 1 || $_SAFE['number'] > 3)
{
  //user is doing something evil, block them, and die.
}
然后,对

可能的注射进行每次使用消毒,以防您之前错过了某些内容。 对于 SQL,这意味着预准备语句使用 PDO 或 MySQLi 将所有变量作为类型化参数传递。对于输出到浏览器,这意味着 htmlentities()。

魔术引号从 PHP 5.4.0 开始被删除。 http://php.net/manual/en/security.magicquotes.php 解释了原因并推荐了诸如mysql_real_escape_string之类的替代词。清理您的输入是一个好主意,只要它正确完成。祝你好运!