2016-03-08 91 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也被棄用爲不安全。目前的最佳做法是使用準備好的語句(有些人認爲只准備調用存儲過程的準備語句)。 –

相關問題