2015-04-03 76 views
0

我一直在閱讀有關準備語句,它說SQL注入仍然是非常有可能的。現在,如果我正在創建一個Web應用程序,我會用Spring,但我認爲它允許這樣的攻擊很奇怪。準備語句和SQL注入

PreparedStatement強制您選擇索引。這會導致很多問題,因爲您不會總是想要一遍又一遍地選擇相同的位置來存儲數據。即使你創建了一個計數器,它也會產生反效果,因爲它會重置程序關閉的所有內容。

String query = "INSERT INTO offers (name,email.text) VALUES 
'"+name+"','"+email+ "','"+text+"'"; 

可以說上面的代碼是我的查詢。什麼是安全的選擇,並會允許mySQL數據庫中的自動增量。

+2

「的PreparedStatement迫使你挑指數」 - 請解釋。什麼索引,什麼櫃檯,你在說什麼問題? – RealSkeptic 2015-04-03 11:14:50

+0

什麼是櫃檯?你爲什麼需要挑選它?你在自動遞增?這種情況下的位置是什麼?請提供一個例子,說明您如何認爲準備好的聲明有效。 – 2015-04-03 11:16:48

+0

String query =「UPDATE offers SET name = name?WHERE name =?」; 嘗試{ \t \t \t ps = conn.prepareStatement(query); \t \t \t ps.setString(1,user.getName()); \t \t \t ps.setString(2,user.getEmail()); \t \t \t ps.execute(query); \t \t} catch(Exception e){ \t \t \t System.out。println(「更新時出錯:」+ e); \t \t} \t} – jocdrew21 2015-04-03 11:41:45

回答

1

已準備語句的查詢將是這樣的:

String sql = "insert into offers (name, email, text) values(?, ?, ?); 

您在本創建一個PreparedStatement。然後設置基於1的索引值並執行查詢。 SQL注入100%安全!

有了Spring,你可能會使用JdbcTemplate。請注意,NamedParameterJdbcTemplate實現不使用索引,而是使用命名參數。查詢將爲:

String sql = "insert into offers (name, email, text) values(:name, :email, :text); 

然後設置基於名稱的值並執行查詢。再次100%安全的SQL注入!

+0

當我嘗試使用您的方法@Stefaan Neyts時,出現SQL錯誤。 String query =「insert into offers(name,email,text)values(?,?,?);」; \t ps.setString(1,user.getName()); \t \t \t ps.setString(2,user.getEmail()); \t \t \t ps.setString(3,user.getText()); – jocdrew21 2015-04-03 11:47:26

3

如果您像編寫SQL一樣將SQL變量與您的SQL語句連接起來,就可以使用PreparedStatement進行SQL注入攻擊。

您的查詢應該是

String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?) 

通過級聯值像你這樣,你確實允許SQL注入的可能性,因爲這些變量的值可以是實際的SQL這將導致您的插入做一些事情,沒有打算。你可以像我一樣使用它,然後以編程方式設置它們。這些值將正確地轉義,從而防止發生SQL注入攻擊。

閱讀此處以瞭解如何設置? SQL中的值就像我寫的一樣。

Using Prepared Statements