FindBugs说我需要“使用准备好的声明”?怎么样?

时间:2015-04-20 15:51:38

标签: java jdbc findbugs

我运行了FindBugs,这是第2行的错误。

Statement st = con.createStatement();
                        st.executeUpdate("UPDATE menu set menu.name'"
                                + value2 + "', menu.info'" + value3
                                + "', menu.price'" + value4
                                + "' where menu.menuID='" + value1 + "'");
                        JOptionPane.showMessageDialog(p2,
                                "Updated successfully");
                        con.close();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(p2,
                                "Error in updating edit fields");
                    }
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(p2, "Error");
            }
        }
    });

我运行了FindBugs,这是第2行的错误。

  

错误:ie.lyit.flight.Changeadd $ 5.actionPerformed(ActionEvent)将非常量String传递给SQL语句上的execute或addBatch方法   该方法使用似乎是动态生成的String在SQL语句上调用execute或addBatch方法。请考虑使用预准备语句。它更有效,更不容易受到SQL注入攻击。

     排名:令人不安(10),信心:很高   模式:SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE   类型:SQL,类别:安全(安全)

我想知道是否有人知道如何摆脱这个错误以及我将如何去做呢?

1 个答案:

答案 0 :(得分:3)

请参阅the JDBC tutorial on using prepared statements

在这种情况下,这可能类似于:

stmt = con.prepareStatement("UPDATE menu set menu.name=?, menu.info=?, menu.price=? where menu.menuID=?")
stmt.setString(1, value2); /* menu.name */
stmt.setString(2, value3); /* menu.info */
stmt.setFloat(3, value4);  /* menu.price */
stmt.setInt(4, value1);    /* menuID */
stmt.executeUpdate();