[英]Are my sql jdbc methods safe from sql injection attack?
我只是在搜索“如何在其中添加記錄到數據庫中”,然后偶然發現了我的程序“ sql注入”可能存在的漏洞。 我對此並不了解。 我首先在此頁面上看到它。 人們在說一些關於參數化查詢的事情。
這是我在Java中的代碼:
public int addItem(String name, String manufacturer, String desc, String id, String category, double cost) throws SQLException{
String additem = "INSERT INTO item VALUES(" + addComma(returnInQuotes(id)) + addComma(returnInQuotes(name)) + addComma(returnInQuotes(manufacturer)) +
addComma(returnInQuotes(desc)) + addComma(returnInQuotes(category)) + cost + ")";
Statement statement = con.createStatement();
return statement.executeUpdate(additem);
}
public int removeItemById(String id) throws SQLException{
String removeitembyid = "DELETE FROM item WHERE id = " + returnInQuotes(id);
Statement statement = con.createStatement();
return statement.executeUpdate(removeitembyid);
}
private String returnInQuotes(String str){
return "'" + str + "'";
}
private String addComma(String str){
return str + ",";
}
addComma
和returnInQuotes
是我制作的方法,因為我討厭在需要它們的方法中鍵入它們。
到目前為止,我已經在沒有引號的情況下嘗試了查詢,如果沒有引號,derby jdbc似乎無法工作。
直接將用戶輸入用於sql語句時,可以使用SQL注入,克服此漏洞的一個好方法是在Java中使用PreparedStatement
:
public int addItem(String name, String manufacturer, String desc, String id, String category, double cost) throws SQLException{
String additem = "INSERT INTO item VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement statement = con.prepareStatement(additem);
statement.setString(1, id);
statement.setString(2, name);
statement.setString(3, manufacturer);
statement.setString(4, desc);
statement.setString(5, category);
statement.setDouble(6, cost);
return statement.executeUpdate();
}
public int removeItemById(String id) throws SQLException{
String removeitembyid = "DELETE FROM item WHERE id = ?";
PreparedStatement statement = con.prepareStatement(removeitembyid);
statement.setString(1, id);
return statement.executeUpdate();
}
您也不需要自己添加報價,因為報價是自動添加的。
不,您的代碼不安全。 您需要更改此方法以轉義嵌入的撇號:
private String returnInQuotes(String str){
return "'" + str.replace("'", "''") + "'";
}
否則,這樣的id:
1'; delete from item where 'a' = 'a
如果您的驅動程序允許在一個調用中執行多個語句,將會造成災難性的影響。
但是,防止注入的最佳方法是使用准備好的語句並設置參數值。 司機為您處理報價。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.