【问题标题】:Inserting variables with SQL in Java在 Java 中使用 SQL 插入变量
【发布时间】:2014-04-07 20:15:28
【问题描述】:

我正在编写一个网页,它从表单中获取输入,通过 cgi 将其发送到 java 文件,通过 sql 将输入插入数据库,然后打印出数据库。我在使用变量插入数据库时​​遇到了麻烦,我想知道是否有人可以帮助我。

String a1Insert = (String)form.get("a1");
 String a2Insert = (String)form.get("a2");

这是我从表单中获取变量的地方(只要相信它有效,还有更多后端,但我以前使用过它,我知道它可以正确获取变量)。

 String dbURL = "jdbc:derby://blah.blahblah.ca:CSE2014;user=blah;password=blarg";
  Connection conn = DriverManager.getConnection(dbURL);
  Statement stmt = conn.createStatement();
  stmt.executeUpdate("set schema course");
 stmt.executeUpdate("INSERT INTO MEMBER VALUES (a1Insert, a2Insert)"); 
 stmt.close();

这是我尝试插入数据库的地方。它给了我错误:

Column 'A1INSERT' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'A1INSERT' is not a column in the target table.

如果有人有任何想法会很可爱^.^谢谢

【问题讨论】:

  • 如果语法正确 -- stmt.executeUpdate("INSERT INTO MEMBER VALUES ('" + a1Insert + "', '" + a2Insert + "')"); -- 那么它在技术上会起作用,但是如果有人可以操纵 a1Insert/s2Insert 并将它们设置为恶意值,那么它会让你容易受到 SQL 注入攻击。因此,您应该遵循 Nathan 提到的带有 PreparedStatement 的方法。
  • @NeilCoffey 除了正确的 SQL 指定了插入语句中的列名。所以需要将...放入成员(colname1,colname2)值(value1,value2)
  • @jwenting 原则上,如果值匹配,您可以省略列名。
  • @NeilCoffey 并且对于您暗示的列顺序不会有任何混淆......我有数据库给出错误,在插入所有列顺序不明确的列时将它们排除在外(例如一个有 2列,都是 varchar)。

标签: java sql derby


【解决方案1】:

java.sql.Statement 不支持参数,切换到java.sql.PreparedStatement 将允许您设置参数。将 SQL 中的参数名称替换为 ?,并在准备好的语句上调用 setter 方法为每个参数分配一个值。这看起来像

String sql = "INSERT INTO MEMBER VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "a1");
stmt.setString(2, "a2");
stmt.executeUpdate();

这将执行 SQL

INSERT INTO MEMBER VALUES ('a1', 'a2')

请注意参数索引从 1 开始,而不是 0。还请注意,我不必在字符串上加上引号,PreparedStatement 为我做了。

或者,您可以继续使用 Statement 并在 Java 代码中创建 SQL 字符串,但这会引入 SQL 注入攻击的可能性。使用 PreparedStatement 设置参数可以通过为您处理报价来避免该问题;如果它在参数值中找到引号,它将对其进行转义,这样就不会影响包含它的 SQL 语句。

Oracle 在这里有一个tutorial

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多