2012-05-17 76 views
0

我正在開發一個PHP函數來處理來自Web表單的提交。使用preg_replace進行PHP安全性

允許的字符嚴格爲字母數字,a-b,0-9。

在處理和插入數據庫之前,依靠preg_replace和正則表達式來清理此數據是否安全?

我已經看過很多關於正常PHP數據清理選項的內容,但是由於系統設計嚴格禁止使用非字母數字字符,所以我認爲這將更容易去除任何不符合從一開始就匹配/[^a-zA-Z\s-0-9.,']/。

我在正確的軌道上嗎?

+0

您顯示的正則表達式不是嚴格的字母數字。在存儲到數據庫中之前,您肯定應該轉義(如果您尚未使用準備好的語句)。 – kapa

回答

4

如果您只允許字母數字字符存儲在您的數據庫中,而不是剝離無效字符,則最好向用戶返回一個錯誤,以提供無效輸入。這樣,用戶在看到他們的數據以不同於最初輸入的形式顯示給他們時,不會感到困惑。

換言之,使用preg_match()驗證輸入以確保它符合您的要求,如果沒有,請將錯誤返回給用戶以便他們修復它。然後將其轉義以插入到數據庫中或使用準備好的語句。

if (!preg_match('/^[a-z0-9., ]$/i', $input)) { 
    // error Invalid input. Please use only letters and numbers 
} 
else { 
    // call escape function on $input or insert it with a prepared statement 
    // whatever is the appropriate method for your RDBMS api. 
} 
+0

需要'/ i'。雖然我更喜歡'if(preg_match('/^[\ W _] $ /',$ input)){ – DaveRandom