我们的应用程序中有一个网页允许用户输入内容然后我们将输入添加到sql以访问数据库。 SQL如下所示:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
USER_INPUT 可以是用户输入的任何字符串。在这种情况下,它是SELECT
*
FROM
AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY
WHERE
(
AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY.GGGG_NAME LIKE '%USER_INPUT%')
AND (
AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY.FFF_DATE >= '2016-12-30 00:00:00.000'
AND AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY.FFF_DATE < '2016-12-31 00:00:00.000' )
AND ( (
AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY.HHHH_NO = '00018001410000'
AND AA_BBBB_CCC_DD_EEEEEADAY_XXX_YYY.HHHH_CCY = 'XXX'))
AND 1=1
AND (
ZZZ_DATE >= '2016-06-01 00:00:00.000')
ORDER BY
11 DESC
,有时可能是%USER_INPUT%
。
现在我们的日志中有一个例外,
在“ADAY_XXX_YYY.HHHH_NO”后面找到意外的标记“=”。 预期的令牌可能包括:“)”.. SQLCODE = -104,SQLSTATE = 42601, DRIVER = 3.64.82
我的猜测是用户输入一些字符串会破坏有效的sql并导致USER_INPUT%
被破坏。在我测试时,只需在输入字符串中添加'就可以轻松获得ADAY_XXX_YYY.HHHH_NO =
,但无法确定哪种输入可能导致YY.GGGG_NAME LIKE
被破坏。任何帮助将不胜感激。