簡體   English   中英

我的sql jdbc方法是否可以防止sql注入攻擊?

[英]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 + ",";
}

addCommareturnInQuotes是我制作的方法,因為我討厭在需要它們的方法中鍵入它們。

到目前為止,我已經在沒有引號的情況下嘗試了查詢,如果沒有引號,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.

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