簡體   English   中英

即使在准備好的語句上也可以進行SQL注入

[英]Is SQL injection possible even on a prepared statement

我閱讀了許多有關Stack Overflow的文章,內容涉及如何通過使用准備好的語句來防止SQL注入

但是,即使在准備好的語句上,也可以進行SQL注入嗎?還是100%安全?

下面是我的java代碼

 String query = "SELECT * FROM Users WHERE username=? and password=?";

 ps=con.prepareStatement(query);  

 ps.setString(1,username);
 ps.setString(2,password);

 rs = ps.executeQuery();

 status = rs.next();

 if(status==true){
.....
}else{
....
}

我嘗試了一些SQL注入查詢

一些輸入:

SELECT * FROM users WHERE username = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

我還嘗試了其他一些查詢,但是由於(單引號)'已被轉義(/'),因此所有SQL注入查詢似乎均不起作用。

請建議我是否有任何可用於上述代碼中的SQL注入的SQL注入查詢/技術。

此查詢: String query = "SELECT * FROM Users WHERE username=? and password=?"; 是安全的,因為無論參數如何,它都仍將作為簡單選擇執行。 至多,它將結束瀏覽整個表。

但是,准備好的語句只是一種工具,(不好的)程序員可能仍然會濫用它。

讓我們看看下面的查詢

String query = "SELECT id, " + paramName + " FROM Users WHERE username=? and password=?";

其中paramName將是參數名稱。 它僅與paramName一樣安全,因為您直接使用變量來構建將由數據庫引擎解析的字符串。 在這里, PreparedStatement無法提供幫助,因為JDBC不允許參數化列名。

因此,這里的規則將是:

  • 如果可以,請避免這樣的構造!
  • 如果確實需要,請仔細檢查(正則表達式,允許的字符串列表等), paramName不能是您期望的以外的其他東西,因為該控件是唯一防止 SQL注入的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM