Java 我的sql jdbc方法是否安全,不受sql注入攻击?

Java 我的sql jdbc方法是否安全,不受sql注入攻击?,java,sql,jdbc,sql-injection,derby,Java,Sql,Jdbc,Sql Injection,Derby,我只是在谷歌上搜索“如何将记录添加到带有“in-the”的数据库”,然后偶然发现我的程序可能存在一个漏洞,“sql注入”。我对此不太了解;我是第一次看到它的。人们在谈论参数化查询 以下是我的java代码: public int addItem(String name, String manufacturer, String desc, String id, String category, double cost) throws SQLException{ String additem

我只是在谷歌上搜索“如何将记录添加到带有“in-the”的数据库”,然后偶然发现我的程序可能存在一个漏洞,“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似乎无法工作。

不,您的代码不安全。您需要更改此方法以转义嵌入的撇号:

private String returnInQuotes(String str){
    return "'" + str.replace("'", "''") + "'";
}
否则,可以使用如下id:

1'; delete from item where 'a' = 'a
如果您的驱动程序允许在一个调用中执行多个语句,则会产生灾难性的影响


但是,防止注入的最佳方法是使用准备好的语句并设置参数值;驱动程序为您处理报价。

当您直接为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();
}

您也不需要自己添加引号,它们是自动添加的。

查看使用参数占位符;只要谷歌一下,你就会发现很多东西