我允许用户根据表中预定义的列生成表达式。用户可以创建列、表,并可以定义诸如唯一列和非空列之类的约束。我还想允许它们生成“计算列”。我知道PostgreSQL不允许计算列,因此我将使用如下表达式:

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

用户可以输入如下内容
{{CarPrice}} + ({{CarPrice}} * {{TaxRate}})

然后它被翻译成
CarPrice + (CarPrice * TaxRate)

不确定这是否易受sql注入攻击。如果是的话,我怎么才能保证安全?

最佳答案

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

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

将允许用户从他有权限的任何其他表中选择任何内容。您可以尝试构建表达式树来避免这种情况:将用户输入解析为描述变量和变量之间的算术操作(如解析算术表达式)的结构。否则,您可以从字符串中删除所有{{}(确保任何{{}都对应于表中的列),并检查是否只剩下“+-*)”和空白字符。
请注意,从用户体验的角度来看,无论如何都需要解析表达式,以便在不实际运行查询的情况下警告用户错误。

10-06 07:09