0

我有一个需要从数据库中提取数据的要求。查询是-

SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob 
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f 
WHERE %s AND uid = e.uid AND uid = f.uid

这里 %s 是用户将从 html 表单输入的 where 子句之后的谓词。

用户输入将采用以下形式:
1. TradeDate = ' 2013-04-05' AND IsLatest = 'TRUE'
2. StreamId= ' IA0015'
3. 查询也可能有 IN 子句

现在,当呈现此查询时,我得到异常不明确的列 streamId 或不明确的列 IsLatest,因为这些列存在于多个同名的表中。因此,为了消除这种歧义,我需要将查询修改为 - ir.IsLatest 或 ir.StreamId

要通过java代码做到这一点,我需要先在where子句之后解析谓词,提取列名并在每个列名之前插入表名别名-'ir',以便查询变为-

SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob 
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f 
WHERE ir.TradeDate = '2013-04-05' AND ir.IsLatest = 'TRUE' AND uid = e.uid AND uid = f.uid

解析此谓词的最佳方法是什么,或者是否有任何其他方法可以达到相同的结果?

4

1 回答 1

0

我对这个问题的回答是不解析用户输入——有太多可能出错的地方。拥有一个带有下拉菜单和用于选择相等、不等式、范围、in 语句等的按钮的 UI 会好得多。这似乎需要更多工作,但保护自己免受 SQL 注入攻击就更重要了。而且即使您不担心恶意 SQL 注入,用户仍然必须完全正确地完成每件事,否则语句会失败。

于 2013-08-16T10:00:36.703 回答