2012-01-04 72 views
3

如果我在mySQLi中使用準備語句,我是否仍然需要以任何方式轉義或檢查用戶輸入。因此,舉例來說,如果我有代碼:PHP&mySQLi:使用準備語句時是否還需要檢查用戶輸入?

$members = new mysqli("localhost", "user", "pass", "members"); 
$r_email = $_POST['r_email']; 
$check = $members->prepare("select user_id from users where email = ?"); 
$check->bind_param('s', $r_email); 
$check->execute(); 
$check->store_result(); 
if ($check->num_rows > 0) { 
    echo "user already registered"; 
    $check->close(); 
} 
$members->close(); 

我需要改變$r_email = $_POST['r_email']$r_email = mysql_real_escape_string($_POST['r_email']);

感謝。

+0

[PHP MySQLi準備的查詢綁定參數是否安全?](http://stackoverflow.com/questions/1561586/are-php-mysqli-prepared-queries-with-bound-parameters-secure) – outis 2012-07-19 10:03:42

回答

4

這是沒有必要如果您要作爲參數傳遞,則轉義一個值。事實上,你不應該,因爲你會在你的數據中插入文字反斜槓。

這些在準備時必須是SQL查詢的一部分,所以RDBMS可以解析和驗證它們。或在表單上驗證用戶輸入。

總是使用SQL語句輸入的SQL-Escape數據。從不SQL-逃避SQL語句之外的數據。

6

你不需要預處理語句逃跑,但它仍然是驗證用戶輸入一個好主意(如必填字段已填充,數字字段包含數值等)

+0

感謝您提供簡單易懂的答案,使我不必發表類似的問題。 – drooh 2016-07-27 20:01:11

2

沒有必要轉義輸入,但不要吝嗇驗證,你仍然可能有邏輯錯誤,如提交的空電子郵件,或一些其他副作用,可能會回來咬你。

始終驗證,讓您在稍後測試bug時保持清醒,這是我的座右銘@至少。