2009-08-08 113 views
3

I read that you do not need to validate or sanitize user's input如果您使用準備好的語句,請了解用於準備語句的用戶數據的驗證

這在下面的例子中對我沒有意義。

用戶給他的電子郵件地址。

我通常運行此

輸入驗證碼

// to validate data 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
    header("Location: index.php"); 
    die("Wrong email-address"); 
} 

聲明說,我們並不需要,如果我們使用準備好的語句來驗證數據,如下

代碼,而不驗證碼

// to get email-address nad passhash from the db 
$result = pg_prepare($dbconn, "query2", 'SELECT email, passhash_md5 
    FROM users WHERE email = $1 
    AND passhash_md5 = $2;'); 
$result = pg_execute($dbconn, "query2", array($_POST['email'], $_POST['password'])); 
if(!$result) { 
    echo "An error occurred"; 
    exit; 
} 

由於我們使用pg_preparepg_execute,因此我不確定是否需要驗證碼或最後一個代碼。

如果您使用準備好的語句,您是否需要考慮驗證和消毒用戶的輸入?

+0

謝謝你的回答! – 2009-08-08 03:36:11

回答

6

您仍然需要驗證您的數據,但您不必對其進行消毒。

使用預處理語句可防止插入惡意代碼,但不會檢查其形式是否有意義。

3

準備好的語句會照顧到惡意的意圖,但它仍然取決於您,以確認您的用戶正在輸入您所期望的內容。

例如,如果您有一個要求輸入電話號碼的表單,輸入「jkl; asdgfjkladg」的用戶不會對您的數據庫造成任何損害,但數據無可避免。

永遠不要相信你的用戶做他們應該做的事。如果您接受用戶的輸入,請進行驗證以確保其正確執行。

4

分離驗證和消毒是很重要的。

驗證正在確保用戶輸入了正確的數據類型或格式。例如,在網絡表單上,某人可能會破解選擇輸入的響應,以提交未在您提供的選擇中顯示的值。驗證可以捕獲此錯誤,並向用戶提供合適的錯誤消息。用戶也可以輸入一個字符串到需要數字值的字段中。如果您在嘗試查詢之前未檢查此內容,則查詢可能會失敗,並且確定原因並向用戶提供錯誤消息將會更困難,或者查詢可能會以不正確的數據靜默地成功。

消毒確保數據在添加到數據庫時不會造成傷害(或稍後顯示在網站上,導致XSS攻擊等)。如果$name = "O'Reilly",則查詢INSERT INTO people (names) VALUES('$name')將失敗,但準備好的語句在將字符串作爲參數進行綁定時將自動轉義單引號。當使用不同的字符集時,這一點尤爲重要,因爲可能不僅僅是引用問題的引號和斜槓字符,還可能允許SQL注入攻擊。

爲了檢查用戶是否真的輸入了電子郵件地址,您需要保留驗證碼,因爲PostgreSQL不知道輸入的數據應該是電子郵件地址,並且會存儲您提供的任何字符串到它。