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

use*_*701 9 java security sql-injection jdbc

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

String username = getDangerousValueFromUser();
Statement stmt = conn.createStatement();
stmt.execute("some statement where username = '" + username + "'"));
Run Code Online (Sandbox Code Playgroud)

在使用声明之前我们如何逃避"用户名"?

Jig*_*shi 16

使用准备好的声明.

例如 :

con.prepareStatement("update Orders set pname = ? where Prod_Id = ?");
pstmt.setInt(2, 100);
pstmt.setString(1, "Bob");
pstmt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

它将阻止原始SQL注入

如果要转义sql字符串,请检查StringEscapeUtils.escapeSql().请注意,此方法在Commons Lang 3中已弃用.

另见

  • 寻找相同的答案 - 我的用例是在SQL Server中调用`BULK INSERT`.此语句**不接受批量文件名的参数**.因此,这是SQL参数转义的完全有效的用例.但我同意99.99%的人不知道他们在问什么:).http://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure (5认同)
  • @JoachimSauer嗯,当时我确实需要知道如何转义SQL查询的参数,并且对这个答案感到沮丧,因为它与我需要的东西无关(尽管OP问的是同样的事情).因此,不要假设为某人服务或不服务的人,因为很容易忘记并非所有人都做与您习惯的相同类型的编程任务. (2认同)