2016-03-08 92 views
0

在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连接。

我只是想解决这样做是否有任何好处。

+2

基于WordPress的安全历史,我不会想象它太有用... –

+2

自动对全局变量做任何事情是一个坏主意。 – 2016-03-08 21:14:42

回答

2

关于全局变量的魔术引号通常是懒惰的安全性,并导致更糟糕的问题。我猜想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. 
} 
然后,消毒每次使用的可能注入,如果你错过了什么更早。对于意味着准备好的语句使用PDO或MySQLi将所有变量作为类型化参数传递的SQL。用于输出到表示htmlentities()的浏览器。

1

魔术引号自PHP 5.4.0起删除。 http://php.net/manual/en/security.magicquotes.php解释了为什么和推荐诸如mysql_real_escape_string之类的替代方法。只要正确完成,清理输入信息是一个好主意。祝你好运!

+3

mysql_real_escape_string也被弃用为不安全。目前的最佳做法是使用准备好的语句(有些人认为只准备调用存储过程的准备语句)。 –

相关问题