PHP 是一種流行的網(wǎng)頁(yè)編程語(yǔ)言,被廣泛應(yīng)用于許多網(wǎng)站的開發(fā)中。在 PHP 開發(fā)中有一個(gè)名為 magic_quotes_gpc 的選項(xiàng)是可以用來(lái)自動(dòng)轉(zhuǎn)義輸入值,包括 GET、POST 和 COOKIE 。但是,該選項(xiàng)已從 PHP7.0 開始被標(biāo)記為棄用,不再建議使用。在本文中,我們將討論 magic_quotes_gpc 的作用、優(yōu)缺點(diǎn)以及最佳實(shí)踐。
在 PHP 中,當(dāng)我們從表單終端(如 web 瀏覽器)中接收用戶輸入時(shí),輸入的數(shù)據(jù)可能包含單引號(hào)、雙引號(hào)、反斜杠等特殊字符,這些特殊字符可能對(duì)我們的代碼造成潛在的安全漏洞。因此在開發(fā)中,必須對(duì)這些特殊字符進(jìn)行轉(zhuǎn)義,通常用反斜杠 '\' 進(jìn)行轉(zhuǎn)義。使用 magic_quotes_gpc ,可以在傳遞至腳本之前自動(dòng)完成這種轉(zhuǎn)義。
讓我們來(lái)看一下下面的代碼:
如果我們的網(wǎng)頁(yè) URL 中包含特殊字符,則會(huì)出現(xiàn)不可預(yù)測(cè)的結(jié)果,例如:
http://example.com/test.php?name=Tom's
這個(gè) URL 將使 $_GET['name'] 為 'Tom',而 單引號(hào)和s則被去掉了
如果開啟 magic_quotes_gpc ,則會(huì)自動(dòng)將 Tom's 轉(zhuǎn)義為 Tom\'s。 這將使腳本可以正確處理 $_GET['name'] 變量,因此能夠避免安全漏洞。
那么,使用 magic_quotes_gpc 是否就意味著我們可以松懈安全編碼呢? 不是。例如,當(dāng)用戶提交一個(gè)表單,其中包括 JavaScript 代碼,即用戶想要對(duì)我們的網(wǎng)頁(yè)進(jìn)行攻擊時(shí),magic_quotes_gpc 并不會(huì)對(duì)來(lái)自表單中的 JavaScript 代碼進(jìn)行轉(zhuǎn)義。
此外,使用 magic_quotes_gpc 還可能導(dǎo)致不可預(yù)測(cè)的結(jié)果。比如,我們?cè)诎l(fā)送一些已經(jīng)被轉(zhuǎn)義過(guò)的 POST 數(shù)據(jù)時(shí),再次轉(zhuǎn)義可能會(huì)導(dǎo)致出現(xiàn)錯(cuò)誤結(jié)果。
因此,最好的辦法是使用自己的轉(zhuǎn)義函數(shù)或使用現(xiàn)成的轉(zhuǎn)義庫(kù)來(lái)處理用戶輸入,而不是依賴魔法引號(hào)來(lái)保護(hù)我們的代碼。
下面是一個(gè)示例轉(zhuǎn)義函數(shù):
function custom_escape_string($string) { $search = array("\\", "\n", "\r", "\x00", "\x1a", "'", '"'); $replace = array("\\\\","\\n", "\\r", "\\0", "\Z", "\'", '\"'); return str_replace($search, $replace, $string); }
我們可以使用該函數(shù)來(lái)手動(dòng)轉(zhuǎn)義用戶輸入。例如:
$name = custom_escape_string($_POST['name']); echo $name;
在 PHP7.0 及以上版本中,magic_quotes_gpc 已被廢棄。如果在這些版本中使用 magic_quotes_gpc,則會(huì)出現(xiàn)以下錯(cuò)誤:
PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated
雖然它仍然可以工作,但官方不再支持該選項(xiàng)。
總結(jié)起來(lái),magic_quotes_gpc 能夠自動(dòng)轉(zhuǎn)義用戶輸入,可以保護(hù)我們的代碼,但是它并不能防止所有類型的攻擊,并可能導(dǎo)致意外的錯(cuò)誤。因此,最佳實(shí)踐是手動(dòng)轉(zhuǎn)義用戶輸入或使用現(xiàn)成的轉(zhuǎn)義庫(kù)來(lái)保護(hù)我們的代碼。