[英]Antidote for magic_quotes_gpc()?
我看過數十個PHP代碼段,如下所示:
function DB_Quote($string)
{
if (get_magic_quotes_gpc() == true)
{
$string = stripslashes($string);
}
return mysql_real_escape_string($string);
}
如果我叫DB_Quote("the (\\\\) character is cool");
會發生什么? ? (感謝jspcal!)
我們難道不應該只在get_magic_quotes_gpc() == true
且值源自$_GET
, $_POST
或$_COOKIE
superglobals時才刪除斜線嗎?
第一步是完全關閉魔術引號,如果打開,則發出大的不可忽略的警告。
如果這不是您的選擇,那么我認為,最好的方法是始終刪除所有魔術引號。
// in an include used on every page load:
if (get_magic_quotes_gpc()) {
foreach (array('_GET', '_POST', '_COOKIE', '_REQUEST') as $src) {
foreach ($$src as $key => $val) {
$$src[$key] = stripslashes($val);
}
}
}
對性能的影響不大,但是從那時起使用變量時,您將更加放心。
是的,我也看過數十個這樣的PHP代碼段。 有點傷心
魔術引號是輸入問題。 如果您需要讓應用程序使用舊的錯誤性magic_quotes_gpc
在服務器上運行,則必須在輸入階段通過迭代GET / POST / COOKIES數組並刪除斜杠來解決該問題。 一種簡單的替代方法是檢測魔術引號選項,並在設置時死於“服務器糟透”錯誤。
mysql_real_escape_string
是輸出問題。 如果您不使用參數化查詢(肯定應該考慮),則需要在腳本之外,內容指向數據庫的情況下運行它。
這是程序中兩個獨立的無關階段。 您不能將它們放在相同的函數中,盡管試圖將所有字符串處理封裝到一個盒子中,這很誘人。
難道我們不應該僅在值源自$ _GET,$ _POST或$ _COOKIE超全局變量時才去除斜線嗎?
對,就是這樣。 這就是為什么您引用的代碼段確實有害的原因。 因為跟蹤字符串的原點是不切實際的(特別是因為您可能組合了來自不同來源的字符串,其中一個被斜杠,另一個未被斜杠),所以您不能在一個函數中做到這一點。 它必須是在適當的時候調用的兩個單獨的字符串處理函數。
是的,就像dav所說的那樣,直到腳本只在表單輸入上使用反斜杠...
如果您使用字符串“ O'Reilly”調用脫衣舞,則該字符串將不會更改。 如果您使用以下字符串調用反斜杠:“反斜杠(\\)字符很酷”,則結果將轉義序列\\)替換為)。 因此,在所有db值上使用該函數可能會破壞某些內容,但可能不會引起注意。
像許多應用程序一樣,您也可能不支持魔術引號模式。 檢查並打印錯誤(如果打開)。 默認情況下已禁用多年,不建議這樣做。
數字6是正確的主意,但是沒有用,因為直到PHP 5.4 $$ src [$ key]在$ src [$ key]上使用變量變量語法,該語法被解釋為$ src [0],從而創建變量$ _是沒用的。 只需在$ val和$ val = stripslashes($ val)上使用&(引用運算符)。 此外,否則從PHP 5.4開始,您可能會收到錯誤消息,因為PHP不僅會將_強制轉換為0
您可以先對$ _GET,$ _ POST或$ _COOKIE進行以下操作,然后再對它們進行其他操作:
<?php
if (get_magic_quotes_gpc ())
{
$_POST = array_map ('stripslashes', $_POST);
}
?>
請注意,這僅在輸入數組為“ flat”(不包含子數組)的情況下有效。 如果您希望輸入中包含子數組,則需要編寫自己的回調來進行處理。 就像是
<?php
function slashField ($input)
{
if (is_array ($input))
{
foreach ($input as $key => $row)
{
$input [$key] = slashField ($row);
}
}
else
{
$input = stripslashes ($input);
}
return ($input);
}
if (get_magic_quotes_gpc ())
{
$_POST = array_map ('slashfield', $_POST);
}
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.