2014-05-13 21 views
1

我剛剛從$ _post和$ _get獲得了「preSecure」所有用戶輸入數據的想法。但我想知道這是否是一種好的做法,並希望對此有所投入。這是我想出的:保護所有帖子,並在框架中獲取數據php

function clean_str($str){ 
    return preg_replace('#[^a-z_ [email protected]]#i', '', $str); 
} 

if ($_POST){ 
    foreach ($_POST AS $key => $val){ 
     $_POST[$key] = clean_str($val); 
    } 
} 

if ($_GET){ 
    foreach ($_GET AS $key => $val){ 
     $_GET[$key] = clean_str($val); 
    } 
} 

這段代碼只會在每個http請求的開始處運行。 clean_str函數可以開發爲允許其他字符和替換字符等(這只是一個例子)。但我認爲第一個目標是簡單地防止sql注入。我現在看到的唯一不好的事情就是如果你的「插件」需要從用戶輸入發送sql命令。上面的討論可以包裹在一個函數中,如果需要的話可以調用。 Post和Get是全局變量,所以這不會成爲問題。

我實際上正在編寫我自己的框架(還有很多工作),如果我能完成它,我將發佈。問題是我經常看到新手開發人員在數據庫查詢中添加$ _POST ['userinput']。上面的代碼應該可以做到這一點。那麼這是我要做的一些背景,爲什麼我要提出這個問題。

我會很高興聽到你的想法。這可能不是堆棧溢出的最佳問題,我想我想打開更多討論這種方法來分享想法和意見。但爲了提出我的問題,這將符合以下情況:是否有其他方法比這更快或更具可擴展性,或者是否等於此,或者另一種功能是否可以補充此方法?這種做法是否良好?覆蓋post的全局變量並獲取上面的數據可以嗎?

我知道上面的代碼不是面向對象的,但它是關於在對它們執行檢查之前自動清理用戶輸入數據的方法。我認爲這將節省很多代碼和頭痛。

請與我分享您的想法。由於Stack Overflow的評論僅限於此,如果您在此表中引入新的想法,如果您答覆爲答案,我將不勝感激。評論是對這種情況下的具體想法/回答發表評論。

+0

如果您希望Thomas O'Leary先生在表單中輸入他的名字或輸入網址 –

+0

我從來沒有見過這一點。你需要知道你期待的數據。如果排除幾乎任何東西,很難在SO上發佈代碼。 – AbraCadaver

+0

取決於您如何使您的clean_str功能。你可以在該函數中使用mysql_real_escape_string,而且你也可以使用它。 – Medda86

回答

2

首先,如果用戶試圖注入一個數組,然後它會生成一個通知,您應該檢查字符串調用它,否則前:

Notice: Array to string conversion 

不過說實話,你只是創建你自己的魔術版本,這不是一個好主意。

簡單和更好的解決方案是使用預處理語句,PDO或MySQLi。

魔法報價在PHP Website賽後總結說好聽:

的真正原因魔術引號已被棄用是一個尺寸適合所有人的方法來逃避/報價是判斷錯誤的徹頭徹尾危險的。不同類型的內容具有不同的特殊字符和不同的轉義方式,而且其中一種方式在其他地方會有副作用。任何僞裝成魔術引號的示例代碼,或者對HTML,SQL或其他任何類似的東西進行類似的轉換 - 同樣是錯誤的,同樣也是危險的。

魔術引號不是爲了安全起見。他們從來沒有。這是一個方便的東西 - 它們存在,所以PHP noob可以摸索並最終編寫一些有用的mysql查詢,而無需正確學習轉義/引用數據。它們可以防止一些偶然的語法錯誤,就像他們的工作一樣。但是他們不會阻止惡意和半知識的攻擊者摧毀PHP noob的數據庫。那個可憐的noob可能永遠不會知道他的數據庫現在怎麼樣或爲什麼不在了,因爲魔術引號(或者他的漂亮的「我要逃避一切」功能)給了他一種虛假的安全感。他從來不必學會如何真正處理不可信的輸入。

數據應該在需要轉義的地方以及要使用的地方轉義。 (mysql_real_escape_string - NOT addslashes! - 用於MySQL(除非您有線索並使用準備好的語句),HTML的htmlentities或htmlspecialchars等)。其他任何註定要失敗。

1

這不是一個好方法。防止MySQL注入不僅僅是確保某些角色逃脫的問題 - 即使您嘗試以這種方式進行消毒,仍然存在大量的攻擊。當你可以使用準備好的語句並且不再擔心你需要檢查的所有事情時,看起來你似乎過於複雜。 http://www.php.net/manual/en/mysqli.prepare.php

+0

我正在學習pdo,還沒有嘗試過準備語句。如果我在pdo prepared語句中運行$ _POST ['userinput'],即使用戶輸入類似「test'test」,它也可以工作嗎?準備聲明本身是否需要轉義字符串? – Medda86

+1

@ Medda86它會工作,如果它是任何東西....即使它是「' - Test'」''''''drop table「」\ /'「'」 –

+0

好的謝謝:) – Medda86

相關問題