2012-02-27 64 views
1

例如,我有這個輸入:SQL注入PHP:我需要使用參數化查詢來驗證用戶輸入嗎?

名稱沃利

電子郵件[email protected]'; DROP TABLE ClientTable; PRINT「!太糟糕了,」 -

我的參數化查詢是:

$name = $_REQUEST['name']; 

$email = $_REQUEST['email']; 

$sql = "INSERT INTO ClientTable (Name, Email) 

     VALUES ('$name', '$email')"; 

即使我用這個參數化查詢,我需要驗證用戶輸入? (在這種情況下,電子郵件字段)

或者,已經是安全的,因爲我使用的是參數化查詢,查詢將簡單的存儲所有這些:「[email protected]」; DROP TABLE ClientTable; PRINT'太糟糕了!'''在數據庫中?

謝謝!

+9

這不是一個參數化查詢......完全沒有all.http://27.media.tumblr.com/tumblr_lwru33NE821r803nno1_500.jpg – 2012-02-27 16:18:56

+2

你可以看到[點擊這裏] [1] [1]:http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – JackTurky 2012-02-27 16:20:13

+0

我會檢查用戶輸入的不管是什麼,但也許我'm只是偏執狂... – 2012-02-27 16:20:52

回答

1

你應該做更多的東西是這樣的:

$sql = sprintf("INSERT INTO ClientTable (Name, Email) VALUES ('%s', '%s')", mysql_real_escape_string($name), mysql_real_escape_string($email)); 
+0

其實,我現在喜歡發表@JackTurky的鏈接。我不知道那種方法。我只是寫了一個PHP包裝類來按我的方式做,但我可能會改變它。 – Travesty3 2012-02-27 16:24:51

+0

我也寫了一個PHP包裝類,但我沒有理由將其改爲任何東西 – 2012-02-28 02:23:52

+0

謝謝大家的答案和有用的鏈接。 – 2012-02-28 15:48:29

0

參數化查詢採取逃避的照顧。你仍然可能想要驗證數據。例如,您可能希望確保該電子郵件至少與[email protected]類似,電話號碼只包含數字等。這與數據完整性有關,而不是安全性,儘管存在一些重疊。

但是你不能在你的例子使用參數化查詢您只使用變量替換。參數化查詢將暗示一個Prepared Statement。

+0

謝謝你們的答案和有用的鏈接 – 2012-02-28 15:48:42

1

可以使用

$unsafe_variable = $_POST["user-input"]; 
$safe_variable = mysql_real_escape_string($unsafe_variable); 

mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')"); 
+0

爲什麼-1?你能解釋一下嗎? – JackTurky 2012-02-28 10:32:30

+1

不知道爲什麼-1。 +1將其恢復:-) – Travesty3 2012-02-28 15:58:56