2011-12-05 65 views
6

我閱讀了PDO你不需要逃脫的變量,如果你使用準備並通過變量執行:我是否需要逃避數據庫輸入?

$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)"); 
$st->execute(array($_POST['name'], $_POST['email'])); 

這是TRU?

還是我仍然需要做_POST $有什麼事?

+1

儘管不需要轉義,一定要檢查輸入值的理智,在可接受的範圍,格式正確的電子郵件等,並返回錯誤信息給你的用戶在適當情況下。 –

+0

是的,我只是對sql攻擊感到好奇 – JohnSmith

+0

只要你嚴格對待你的查詢和你的位置(例如,在任何時候都使用參數,永遠不會*允許用戶提供的數據泄漏連接成動態查詢的連接部分),那麼你將是安全的。 – Polynomial

回答

5

編制報表,沒有逃脫是必要的(和逃避的事情自己將導致雙轉義,造成轉義的數據被寫入到數據庫)。

然而,PDO預處理語句不能處理所有查詢變量,有時你必須插入「外國」直接寫入數據到一個查詢字符串,這意味着你將負責正確轉義它。特別是,使用預處理語句無法指定表和/或字段名稱發生更改的動態查詢。例如

SELECT ? FROM ? WHERE ?=? 

無法完成。只能用佔位符指定值。

+0

選擇?哪裏?=似乎不起作用。顯然只有價值可以有? ...... – JohnSmith

+0

沒錯。字段和表名稱不能用佔位符指定。 –

2

簡短的回答:不,你不需要逃避什麼。參數化的查詢是完全怪異'真棒! :)

長答案:不,你不需要逃脫任何東西,因爲它進入數據庫。但是,您還是應該使用htmlspecialchars從查詢顯示數據庫輸出時,防止XSS攻擊,否則你會與別人餡像這樣在任意場結束:

<script type="text/javascript">alert('sup, I'm in ur site!');</script>

+1

顯示數據庫輸出時強調*。一般情況下,您應該不**將HTML存儲在數據庫中,除非您的字段確實是HTML。 – phihag

2

這是真的;代碼是正確的(儘管您可能想要處理未設置$_POST['name']的情況)。

PDO的準備語句的功能移交中,並不需要顯式的轉義格式的值。

+1

需要注意的是PDO實際上並沒有進行任何轉義,它只是完全隔離了查詢語言的數據。 – Polynomial

+0

@Polynomial謝謝,更新。 – phihag

相關問題