我閱讀了PDO你不需要逃脫的變量,如果你使用準備並通過變量執行:我是否需要逃避數據庫輸入?
$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)");
$st->execute(array($_POST['name'], $_POST['email']));
這是TRU?
還是我仍然需要做_POST $有什麼事?
我閱讀了PDO你不需要逃脫的變量,如果你使用準備並通過變量執行:我是否需要逃避數據庫輸入?
$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)");
$st->execute(array($_POST['name'], $_POST['email']));
這是TRU?
還是我仍然需要做_POST $有什麼事?
編制報表,沒有逃脫是必要的(和逃避的事情自己將導致雙轉義,造成轉義的數據被寫入到數據庫)。
然而,PDO預處理語句不能處理所有查詢變量,有時你必須插入「外國」直接寫入數據到一個查詢字符串,這意味着你將負責正確轉義它。特別是,使用預處理語句無法指定表和/或字段名稱發生更改的動態查詢。例如
SELECT ? FROM ? WHERE ?=?
無法完成。只能用佔位符指定值。
選擇?哪裏?=似乎不起作用。顯然只有價值可以有? ...... – JohnSmith
沒錯。字段和表名稱不能用佔位符指定。 –
簡短的回答:不,你不需要逃避什麼。參數化的查詢是完全怪異'真棒! :)
長答案:不,你不需要逃脫任何東西,因爲它進入數據庫。但是,您還是應該使用htmlspecialchars
從查詢顯示數據庫輸出時,防止XSS攻擊,否則你會與別人餡像這樣在任意場結束:
<script type="text/javascript">alert('sup, I'm in ur site!');</script>
。
顯示數據庫輸出時強調*。一般情況下,您應該不**將HTML存儲在數據庫中,除非您的字段確實是HTML。 – phihag
這是真的;代碼是正確的(儘管您可能想要處理未設置$_POST['name']
的情況)。
PDO的準備語句的功能移交中,並不需要顯式的轉義格式的值。
需要注意的是PDO實際上並沒有進行任何轉義,它只是完全隔離了查詢語言的數據。 – Polynomial
@Polynomial謝謝,更新。 – phihag
儘管不需要轉義,一定要檢查輸入值的理智,在可接受的範圍,格式正確的電子郵件等,並返回錯誤信息給你的用戶在適當情況下。 –
是的,我只是對sql攻擊感到好奇 – JohnSmith
只要你嚴格對待你的查詢和你的位置(例如,在任何時候都使用參數,永遠不會*允許用戶提供的數據泄漏連接成動態查詢的連接部分),那麼你將是安全的。 – Polynomial