【问题标题】:Eval Calculation-string: "2 * 3 + 4 * 5" in PostgresqlEval 计算字符串:Postgresql 中的“2 * 3 + 4 * 5”
【发布时间】:2017-03-30 12:55:44
【问题描述】:

我想在 Postgres 中评估纯计算 字符串

例如:eval('234 + 65 * 3')

函数不是常量,所以也可以是2 + 2

期待类似SELECT eval('2 + 2') AS result

我阅读了有关 eval() 函数的巨大安全问题,但这些似乎包含 SELECT 语句。这里纯计算需求。

【问题讨论】:

  • 评估的意义何在?为什么不只是SELECT 2 + 2 AS result
  • 字符串是动态计算的,使用正则表达式和其他查询的结果..如果不是..我为什么要问这个问题..
  • @OtoShavadze 谢谢,我已经看到了,但这让我很担心:“还要记住,这会带来巨大的安全风险”这是我的问题的一部分,纯计算是否有安全的东西。 .

标签: postgresql eval


【解决方案1】:

你需要PL/pgSQL:

create or replace function f(_s text)
returns numeric as $$
declare i numeric;
begin
    execute format('select %s', _s) into i;
    return i;
end;
$$ language plpgsql;

select f('1 + 1');
 f 
---
 2

【讨论】:

  • 没错!这里没有安全问题?是否需要扫描字符串以查找“select”或“insert”之类的单词?
  • @kvdmolen 安全是这里的一个大问题。前任调用f('id from (delete from users returning *) s limit 1') 可能 运行(其中没有select)。
  • @pozs 确实是的.. 你认为这样的东西会起作用吗? EXECUTE format('SELECT %s', replace(replace(_s, 'delete',''),'select','')) INTO i; 所以,将 selectdelete 替换为 ''。不甜,但至少会返回错误。
  • @kvdmolen 如果您真的只有公式,请尝试使用正则表达式验证它(在执行之前)f.ex。 _s ~ '^[\s\d\.\+\-\*/\(\)]+$'
猜你喜欢
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多