我允许用户根据表中预定义的列生成表达式。用户可以创建列、表,并可以定义诸如唯一列和非空列之类的约束。我还想允许它们生成“计算列”。我知道PostgreSQL不允许计算列,因此我将使用如下表达式:
SELECT CarPrice, TaxRate, CarPrice + (CarPrice * TaxRate) AS FullPrice FROM CarMSRP
用户可以输入如下内容
{{CarPrice}} + ({{CarPrice}} * {{TaxRate}})
然后它被翻译成
CarPrice + (CarPrice * TaxRate)
不确定这是否易受sql注入攻击。如果是的话,我怎么才能保证安全?
最佳答案
如果我正确理解您的意思,您只需接受上面描述的用户输入,并在选择列列表中进行替换。如果是这样的话,那肯定不安全,因为:
"* from SomeSystemTable--({{CarPrice}} + ({{CarPrice}} * {{TaxRate}})"
将允许用户从他有权限的任何其他表中选择任何内容。您可以尝试构建表达式树来避免这种情况:将用户输入解析为描述变量和变量之间的算术操作(如解析算术表达式)的结构。否则,您可以从字符串中删除所有{{}(确保任何{{}都对应于表中的列),并检查是否只剩下“+-*)”和空白字符。
请注意,从用户体验的角度来看,无论如何都需要解析表达式,以便在不实际运行查询的情况下警告用户错误。