2016-04-17 17 views
0

我用PDO讀/爲了防止SQL注入進入MySQL數據對於PHP 5.6和PDO,是否需要轉義角色?

$stmt = $DBH->prepare("SELECT * FROM T_Users WHERE User_Name = :UN"); 
$stmt->bindParam(':UN', $user_name); 
$stmt->execute(); 

中我應該在數據庫中輸入他們之前或在顯示數據庫中的數據之前逃脫字符的任何原因瀏覽器嗎?通過將JavaScript代碼記錄到我的數據庫中,惡意的人可以利用我的網站或其他用戶嗎?

謝謝!

+1

你應該在這種情況下不要手動轉義任何東西。數據綁定不會轉義,如果您另外手動轉義,則最終會出現「雙重轉義」字符。不是你想要的。這一切都在文檔中進行了解釋。 – arkascha

+0

通過使用Prepared,Parameterized Queries,您已經在處理SQL注入。沒有必要逃脫任何東西了。 –

+0

如果惡意用戶選擇他的用戶名爲JavaScript代碼 - 如果用戶的用戶名顯示在瀏覽器中,會傷害其他用戶嗎?也許我只是太偏執...... – Mike

回答

2

->prepare();方法與bindParam()一起爲您做所有事情,所以不需要做任何事情。

將參數綁定到準備好的語句變量時,它將原始數據放入,而不是像以前那樣將其添加到查詢中! :)

+1

說出現逃跑事件並不準確:事實上並非如此。 「準備」方法不會漏掉任何東西,因爲它甚至不知道那個時候的值。它們在後來被綁定,*不*逃脫,甚至不被中間件竊取。 – trincot

+1

@trincot雖然'PDO :: ATTR_EMULATE_PREPARES'實際上在綁定它們之後會轉義這些值。 (當然,它不應該;但它仍然是默認的。) – mario

+0

乾杯,編輯。 –

2

你當然不應該逃避你爲綁定參數傳遞的參數。

根本沒有逃跑的事情發生。它是SQL引擎與佔位符編譯語句,並在稍後未單獨接收參數值。 SQL引擎能夠將編譯語句(此時不再有SQL字符串)和確保SQL注入的整個問題變得無關緊要的參數值相結合。

您爲綁定佔位符傳遞的轉義值會產生負面影響。 SQL引擎確實需要這些值,並且如果它們以某種方式被轉義,引擎將不會忽略它們,而是從字面上理解它們。