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