我允许用户针对表格上的预定义列生成表达式。用户可以创建列,表,并可以定义约束,例如unique列和非null列。我还想让他们生成"计算列"。我知道PostgreSQL不允许计算列,所以我可以使用这样的表达式:
SELECT CarPrice, TaxRate, CarPrice + (CarPrice * TaxRate) AS FullPrice FROM CarMSRP
用户可以输入类似的内容
{{CarPrice}} + ({{CarPrice}} * {{TaxRate}})
然后它被翻译成
CarPrice + (CarPrice * TaxRate)
不确定这是否容易受到sql注入攻击。如果是这样,我将如何使其安全?
答案 0 :(得分:2)
为什么不利用STORED PROCEDURES进行此操作?
这样,您可以定义变量以接收用户编写的内容,并检查是否存在一些BLACKLISTED单词(如DELETE,TRUNCATE,ALL,*等)。
我不知道PostgreSQL,但是如果它不可能,你也可以在翻译它们之前检查那些有问题的命令以调用你的SELECT语句。
答案 1 :(得分:1)
如果我理解正确,您只需按照上面描述的用户输入并在选择列列表中替换。如果是这样,那肯定不安全,因为像:
"* from SomeSystemTable--({{CarPrice}} + ({{CarPrice}} * {{TaxRate}})"
允许用户从他有权限的任何其他表中选择任何内容。您可以尝试构建表达式树以避免这种情况:将用户输入解析为描述变量和它们之间的算术运算的某个结构(如解析算术表达式)。否则,您可以从字符串中删除所有{{}}(确保任何{{}}对应于表中的列)并检查是否只剩下“+ - *()”和空白字符。
请注意,从用户体验的角度来看,无论如何都需要解析表达式,以警告用户错误而不实际运行查询。