2008-11-10 99 views
2

我想知道是否有一個快速簡單的函數來清理我的url中的變量,然後再與它們合作(或者$ _POST來設想它...)清理URL變量的整潔方式?

我想我可以使用一個正則表達式來替換未經允許的字符,但我很想聽聽人們用於這類事情?

回答

2

正則表達式可能會有所幫助,PHP 5.2.0也引入了整個filter擴展,專門用於以不同方式過濾輸入變量。

很難推薦單一的解決方案,因爲輸入變量的性質是如此......變量。 :-)

6

清潔輸入的概念從來沒有對我很有意義。它的基礎是假設某些類型的輸入是危險的,但實際上沒有危險輸入這樣的東西;只是錯誤地處理輸入的代碼。

它的罪魁禍首是,如果你嵌入某種字符串(代碼),然後通過任何一種翻譯,的評估內部變量,你必須確保變量是正確轉義。例如,如果您在SQL語句中嵌入字符串,則必須引用和轉義此字符串中的某些字符。如果您將值嵌入網址中,則必須使用urlencode進行轉義。如果您在HTML文檔中嵌入字符串,則必須使用htmlspecialchars進行轉義。等等等等。

嘗試「預先清理」數據是一個註定要失敗的策略,因爲您無法知道 - 在那一刻 - 數據將被用於哪種上下文中。臭名昭着的magic_quotes PHP的反特性是這個被誤導的想法的主要例子。

+1

我一直在使用htmlentities而不是htmlspecialchars;它完全實體轉換。 – 2008-11-10 19:21:38

1

我使用下面的方法來清理MYSQL數據庫使用的輸入。總而言之,通過foreach遍歷$ _POST或$ _GET數組,並通過DBSafe函數傳遞每個$ _POST或$ _GET來清理它。 DBSafe可以很容易地修改爲數據變量的其他用途(例如,HTML輸出等)。

 
// Iterate POST array, pass each to DBSafe function to clean up data 
foreach ($_POST as $key => $PostVal) { 

    // Convert POST Vars into regular vars 
    $$key=DBSafe($PostVal); 

    // Use above statement to leave POST or GET array intact, and use new individual vars 
    // OR, use below to update POST or GET array vars 

    // Update POST vars 
    $_POST[$key]=DBSafe($PostVal); 
} 


function DBSafe($InputVal) { 
// Returns MySQL safe values for DB update. unquoted numeric values; NULL for empty input; escaped, 'single-quoted' string-values; 

    if (is_numeric($InputVal)) { 
    return $InputVal; 
    } else { 
    // escape_string may not be necessary depending on server PHP and MySQL (i.e. magic_quotes) setup. Uncomment below if needed. 
    // $InputVal=mysql_escape_string($InputVal); 
    $InputVal=(!$InputVal?'NULL':"'$InputVal'"); 
    return $InputVal; 
    } 
}