db2 / AS400 SQLException令牌无效

时间:2014-02-21 22:44:15

标签: db2-400

我正在尝试使用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 。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试阻止SQL注入。看起来您已经看到了用两个撇号(')替换单个撇号('')的消化。但他们只谈论用户输入的内容,而不是围绕它。

让我们来看看这样的攻击是如何起作用的。您为用户提供了一个字段,您希望在该字段中输入城市名称。您想在查询中使用该值。

query := "select * from address where upper(city)=upper('" || input_city || ")'"

然后您将发送此查询字符串以供数据库服务器解释。如果他们输入bellvueNEW YORK,一切都会好起来的。但想想如果他们进入Washington's Crossing会发生什么,那么你就会遇到问题。查询字符串的第一部分以撇号结束以启动字符串文字,但是城市名称中的撇号将结束文字,s Crossing将导致语法错误。

现在想象一下如果有人知道这件事会发生什么,并且他们的投入会有创意吗?我们来看几个。

x' or '1'='1
'; select * from tablescatalog where table_name >'
'; delete from customers where name<>'

或其他一些可能会更糟的价值观。现在,您可以看到为什么在动态构建查询时需要特别注意的输入字段。在查询字符串中使用它之前,您需要处理似是而非的字符。

或者,您可以PREPARE参数化查询。这通常是一种更安全的方法。它的表现也好得多。