[英]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.