2011-10-26 99 views
4

現在即時通訊使用準備好的語句,選擇/插入數據到MySQL。 好吧,我的問題,我發現了二階攻擊。 所以用戶例如在我的網站上註冊。 並使用電子郵件或用戶名這樣的事情MYSQL二階攻擊問題

"username '; DELETE Orders;--" 

這得到插入到mysql表

所以,當我通過準備好的聲明中再次接收數據,並插入/在再次用它做什麼準備好聲明。

我會安全因爲我使用準備好的語句?

樣品:

Get Bad Data: 

$sql = "SELECT * FROM USERS where USERID = 1"; 
... 
$stmt->bind_result($username); 
... 

Next Query: 
INSERT or do other things: 
$SQL = "SELECT * FROM email WHERE USERNAME = ?"; 
.... 
$stmt->bind_param('s', $username); 
... 

我思前想後,我會安全,我要是會這樣呢?或者有可能泄漏?

,但我會是易受攻擊的,如果我想這樣做:

$sql = "SELECT * FROM email WHERE username = $username"; 
$stmt = $mysqli->prepare($sql); 
$stmt->execute(); 

感謝:-)

+2

如果你有支持它,你爲什麼不使用準備好的陳述? :) – Marcus

+0

是啊你的權利,我已經做了,但只是好奇......如果我仍然可以攻擊,只是學習編碼:P – user1015314

+0

@Marcus:準備好的語句不能處理所有類型的查詢。有時你不得不去使用裸機,即使在可用和可取的情況下。 –

回答

1

只要佔位符一貫使用(無處不在!)所有[變量]數據,那麼所有SQL注入攻擊*都會受到阻止,二階或其他。

這並不意味着沒有漏洞或其他攻擊媒介 - 但它確實意味着具有「聰明用戶名」的用戶將無法將意外的「DROP」發送到數據庫。正如指出的那樣,如果的任何地方使用「不安全的SQL語句」,那麼,擔保已關閉。

(該組「不安全的SQL語句」包括,但不限於,任何這樣的語句,其確實使用佔位符所有[變量]數據。)

編碼愉快。


*這裏假設佔位符支持/數據庫驅動程序中沒有缺陷/漏洞,當然。但這是另一回事......