如何捕获/编码特殊字符在Java应用程序的SQL Server?(How to capture/en

2019-10-17 03:17发布

我有一个Java应用程序+ SQL Server数据库。 DB操作使用JDBC使用动态SQL字符串。 例:

从选项卡中选择其中柱柱= StringParm

StringParam中是用户输入。 如果stringParm包括撇号,Java应用程序会抛出异常,表示无法执行的SQL。

如何解决这个问题,没有java代码改变?

Answer 1:

不要在SQL查询把用户直接输入。 您需要使用PreparedStatement与参数。 在不改变Java代码,我看不出有什么办法让这个安全。



Answer 2:

我猜你构造SQL以某种方式一样

String sql = "Select Column from tab where column='" + StringParm + "'"; 

或者类似的东西? 如果你这样做,你打开各种漏洞,你还可以看到的行为像你描述的,在那里得到的字符串不再是有效的SQL。 你必须先躲避用户提供的参数。

最好的解决办法是使用预处理语句,所以你做

Statement stmt = conn.prepareStatement("Select Column from tab where column=?");
stmt.setString(1,StringParam);

我看不到解决您的问题,而不会改变任何Java代码虽然任何快速的方法,也许吧逃逸/消毒输入它击中了你的代码之前(如Java描述语言,如果你是一个Web应用程序)



Answer 3:

你真的应该使用java.sql.PreparedStatement设置参数。 该代码的变化应该是最小的,这是问题较少,试图逃跑用户输入。



Answer 4:

无需更改应用程序不能修复这个问题。 SQL Server可以处理的报价,但是你的应用程序(Java代码)不正确转义引号,当你建立你的动态SQL命令。 我更喜欢使用存储过程并传递参数,这样永远不会有任何问题,报价或注射。



Answer 5:

你可以通过把一个触发器在数据库清理条目解决这个问题 - 即当插入尝试,而不是做正确的逃逸输入,然后用新的插入输入继续。 然而,这是错误的层,它可能不应该在那儿完成。 一个更好的解决方案(IMO)是使用事先准备好的声明,并做变量替换,让JDBC做转义为你工作。



文章来源: How to capture/encode special character for SQL Server in java app?