2013-01-11 25 views
0

除了阻止它的過程之外,我對於SQL注入一無所知。SQL注入雖然使用綁定/準備語句?

我想知道,如果攻擊者修改我從準備好的聲明:

$DB = $Con->prepare("SELECT * FROM Test WHERE username=?"); 

$DB->bind_param('s',$Username); 

$DB->execute(); 

他進入了他的說法是:

x' DROP TABLE Test 

如何將綁定/準備的語句處理此請求?

它會返回一個錯誤還是繼續?因爲bind_param將特定值鏈接到所述SQL語句?

+0

爲什麼不自己嘗試一下呢? – Kermit

+0

http://stackoverflow.com/q/8263371/285587 –

回答

0

當使用bind_param時,這些值將被轉義。您應該仍然驗證數據以確保它是正確的,但它是安全的注入

+0

如此準備的語句是100%安全的? – user1968541

+0

從來沒有100%安全。看看XSS,這不是數據庫注入,所以它不會刪除表,而是另一種注入。長話短說,你不必逃避你的投入,但你仍應該研究你應該在不同階段實施其他安全措施 –

1

不,數據庫只會查找用戶名爲x' DROP TABLE Test的記錄,因此您最終可能會得到一個空的結果集。

+0

這樣準備好的聲明是100%安全的嗎? – user1968541

+0

就列的值而言,是的,但是如果你想使用一個字段名稱的變量,準備好的語句(或轉義)是沒有用的,你將不得不使用一個允許名稱的白名單。 – jeroen

0

一旦你準備了一個語句,它就是預編譯的。因此,綁定到它的任何參數都將作爲原始數據發送,絕不可修改SQL語句。

你的例子可以正常工作,它會選擇用戶名爲x' DROP TABLE Test的所有行。

+0

如此準備的語句是100%安全的? – user1968541

+0

就SQL注入而言,是的,它們是安全的。只要你是綁定參數,而不是將它們連接在查詢中,你就是安全的。 – Supericy