2013-10-04 178 views
1

這是我第一次參與這個偉大的網站,所以我希望能得到我的問題的第一個很好的答案。 我使用下面的代碼將數據插入到MySQL數據庫:PDO準備語句安全

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form2")) 
{ 
$q = $conn->prepare("INSERT INTO client (name, address) VALUES (:name, :address)"); 
$q->bindValue(':name', htmlspecialchars($_POST['name']), PDO::PARAM_STR); 
$q->bindValue(':address', htmlspecialchars($_POST['address']), PDO::PARAM_STR); 
$q->execute(); 
} 

是插入是否足夠安全? 我應該使用htmlspecialchars()插入或顯示數據的時刻嗎?

親切的問候

+0

我總是對安全性保持謹慎,所以會剝奪輸入。您直接從表單插入到數據庫中,因此審覈輸入可能是一個好主意。 – dwjv

+0

@dwjv我很確定沒有檢查值isset()第一,你會得到一個通知錯誤。確保設定值並確保其值正確無誤。 –

+1

請參閱http://stackoverflow.com/a/60496/760211,即PDO MySQL驅動程序的默認設置是__emulating prepared statement__。你可能想禁用''emulation''以獲得更好的安全性。 – Kita

回答

3

是你的代碼是安全的,但作爲一個經驗中性形式一般規則,存儲數據。也就是說,不針對任何特定的輸出或媒體進行編碼。做途中編碼出來不。

如果你反其道而行之,通過htmlspecialchars()存儲(如你問題你的代碼),那麼你的數據是專門綁在HTML輸出之前通過。如果您想在其他地方輸出它(例如XML文檔),其中htmlspecialchars()不適用,那麼您必須先解碼它。

+0

是的! 'htmlspecialchars'用於顯示*格式,不用於存儲編碼。應在內容需要呈現時調用它。 – tadman

+0

非常感謝您的回覆,但是您能否告訴我「中性形式」究竟意味着什麼? 另外,你有什麼建議?我怎樣才能改變上面的代碼? – Anibel

+0

通過中性形式我的意思只是在原始形式(沒有'htmlspecialchars()')的任何處理)。我只是從代碼中刪除'htmlspecialchars()'調用,並保持原樣。當您拉出數據並以HTML格式顯示時,請不要忘記執行'htmlspecialchars()'調用。 – MrCode