2016-01-30 77 views
0

我最近學會了不使用PreparedStatements的.set()方法是一個相當巨大的安全漏洞。PreparedStatements的安全性如何?

看過一些代碼示例後,我有幾個關於PreparedStatements及其安全性的問題。

如果有人可以攻擊MySQL查詢來更改數據,PreparedStatement的.set()方法到底如何防止攻擊?

例如,如果查詢是

INSERT INTO table_name(?, ?); 

(假設這兩個問號將字符串)

不能有人簡單地將表名更改爲另一個表?

又如: 如果查詢

UPDATE table_name SET column_name=?; 

無法一個人改列名進行查詢改變目前存在的列?

我能想到的最後一個例子; 如果查詢

SELECT column_name FROM table_name WHERE column2_name = ?; 

是否有可能爲攻擊者修改列名,表名等,或注入其他動作到查詢?你可能會說,我對安全性和MySQL知之甚少,所以如果這些問題是非常明顯的問題,不好意思。謝謝!

回答

1

值在事先準備好的聲明的是,你從查詢字符串本身分開可變數據。這提供了兩個主要的優點:

  1. 在重複查詢的情況下,只有發送的數據不同,查詢本身不需要重新解析;相反,只有新數據需要發送。

  2. 由於您的數據與查詢字符串本身是分開的,並且以安全的方式發送,因此您可以免受可能導致直接包含在查詢字符串中的不正確轉義數據的SQL注入攻擊。

預處理語句(而不是爲了)保護你從你的客戶和你的數據庫之間(數據或)人在這方面的中間人攻擊可能會改變查詢,你打算送。爲此,您需要使用SSL傳輸,否則確保攻擊者無法干涉您與數據庫的溝通。

+0

好的。所以它的要點是SQL注入攻擊只能修改查詢中發送的數據,而不是查詢本身?那MITM攻擊實際上能夠修改查詢? (感謝您的答覆btw)。 –

+1

一個成功的SQL注入攻擊會暗示你的數據是查詢字符串本身的一部分,並且這個漏洞是查詢做了你不打算的事情,而不僅僅是不正確的數據進入數據庫。如果數據與查詢分離,那麼任何惡意輸入都只是數據的一部分。如果攻擊者能夠讀取和修改數據,MITM可能會影響您的應用程序通過攻擊者的任何內容。 (但請注意,只讀MITM仍然很危險。) – jbafford