我正在尝试使用AS400 Transfer 来解决可能的 SQL可压缩性问题。解决方案之一是通过添加编码来更改查询。
EX:"select * from address where city='bellevue' "
将替换为:"select * from address where city=''bellevue'' "
。该查询引发异常:java.sql.SQLException:[SQL0101]Token bellevue was not valid. Valid tokens:FOR....
Oracle , MySQL 似乎在执行相同类型的查询时没有问题,但 DB2 / AS400 不喜欢它。只有一个“'”查询效果很好。使用 JDBC 连接驱动程序: com.ibm.as400.access.AS400JDBCDriver 。知道为什么吗?
答案 0 :(得分:0)
您正在尝试阻止SQL注入。看起来您已经看到了用两个撇号('
)替换单个撇号(''
)的消化。但他们只谈论用户输入的内容,而不是围绕它。
让我们来看看这样的攻击是如何起作用的。您为用户提供了一个字段,您希望在该字段中输入城市名称。您想在查询中使用该值。
query := "select * from address where upper(city)=upper('" || input_city || ")'"
然后您将发送此查询字符串以供数据库服务器解释。如果他们输入bellvue
或NEW YORK
,一切都会好起来的。但想想如果他们进入Washington's Crossing
会发生什么,那么你就会遇到问题。查询字符串的第一部分以撇号结束以启动字符串文字,但是城市名称中的撇号将结束文字,s Crossing
将导致语法错误。
现在想象一下如果有人知道这件事会发生什么,并且他们的投入会有创意吗?我们来看几个。
x' or '1'='1
'; select * from tablescatalog where table_name >'
'; delete from customers where name<>'
或其他一些可能会更糟的价值观。现在,您可以看到为什么在动态构建查询时需要特别注意的输入字段。在查询字符串中使用它之前,您需要处理似是而非的字符。
或者,您可以PREPARE参数化查询。这通常是一种更安全的方法。它的表现也好得多。