允许用户生成的表达式针对SQL列

时间:2016-04-01 17:39:39

标签: c# postgresql

我允许用户针对表格上的预定义列生成表达式。用户可以创建列,表,并可以定义约束,例如unique列和非null列。我还想让他们生成"计算列"。我知道PostgreSQL不允许计算列,所以我可以使用这样的表达式:

SELECT CarPrice, TaxRate, CarPrice + (CarPrice * TaxRate) AS FullPrice FROM CarMSRP

用户可以输入类似的内容

{{CarPrice}} + ({{CarPrice}} * {{TaxRate}})

然后它被翻译成

CarPrice + (CarPrice * TaxRate)

不确定这是否容易受到sql注入攻击。如果是这样,我将如何使其安全?

2 个答案:

答案 0 :(得分:2)

为什么不利用STORED PROCEDURES进行此操作?

这样,您可以定义变量以接收用户编写的内容,并检查是否存在一些BLACKLISTED单词(如DELETE,TRUNCATE,ALL,*等)。

我不知道PostgreSQL,但是如果它不可能,你也可以在翻译它们之前检查那些有问题的命令以调用你的SELECT语句。

答案 1 :(得分:1)

如果我理解正确,您只需按照上面描述的用户输入并在选择列列表中替换。如果是这样,那肯定不安全,因为像:

"* from SomeSystemTable--({{CarPrice}} + ({{CarPrice}} * {{TaxRate}})"

允许用户从他有权限的任何其他表中选择任何内容。您可以尝试构建表达式树以避免这种情况:将用户输入解析为描述变量和它们之间的算术运算的某个结构(如解析算术表达式)。否则,您可以从字符串中删除所有{{}}(确保任何{{}}对应于表中的列)并检查是否只剩下“+ - *()”和空白字符。

请注意,从用户体验的角度来看,无论如何都需要解析表达式,以警告用户错误而不实际运行查询。