簡體   English   中英

magic_quotes_gpc()的解毒劑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM