Java 如何使用SQL查询转义用户提供的参数?

Java 如何使用SQL查询转义用户提供的参数?,java,security,jdbc,sql-injection,Java,Security,Jdbc,Sql Injection,尝试开始使用JDBC(使用Jetty+MySQL)。我不知道如何在SQL语句中转义用户提供的参数。例如: String username = getDangerousValueFromUser(); Statement stmt = conn.createStatement(); stmt.execute("some statement where username = '" + username + "'")); 在与语句一起使用之前,如何转义“username” 例如: con.prepa

尝试开始使用JDBC(使用Jetty+MySQL)。我不知道如何在SQL语句中转义用户提供的参数。例如:

String username = getDangerousValueFromUser();
Statement stmt = conn.createStatement();
stmt.execute("some statement where username = '" + username + "'"));
在与语句一起使用之前,如何转义“username”

例如:

con.prepareStatement("update Orders set pname = ? where Prod_Id = ?");
pstmt.setInt(2, 100);
pstmt.setString(1, "Bob");
pstmt.executeUpdate();
它将阻止原始SQL注入

如果要转义sql字符串,请检查。请注意,此方法是有效的

另请参见


@lvella要逃避您可以使用的sql,请先阅读它的文档use@JoachimSauer嗯,当时我确实需要知道如何为SQL查询转义参数,并且对这个答案感到沮丧,因为它与我所需要的无关(尽管OP问的是同一件事)。因此,不要假设什么可以或不可以为某人服务,因为很容易忘记,并不是每个人都做与你习惯的相同类型的编程任务。@Ivella:首先:我真的无法想象有什么好的理由手动转义SQL语句的数据,你能告诉我这对你有什么好处吗?第二:这种情况很少见。真的,真的很少见。90%的情况下,当有人要求“在Java中转义SQL数据”时,他们根本不知道prepared语句,并假设build-the-SQL-string方法是唯一有效的方法。@avernet:您可以这样做(我已经这样做了):在(?,?)中生成
并调用相应的
集*()
方法。寻找相同的答案-我的用例是在SQL Server中调用
批量插入。此语句不接受大容量文件名的参数。所以这是SQL参数转义的完全有效的用例。但我同意99.99%的人不知道他们在问什么:)。