在服务器上验证(重新运行)客户端数学计算

问题描述 投票:0回答:1

我们的用户可以根据表单字段进行数学计算。为了评估计算,我使用 expr-eval 作为 javascript(客户端)的表达式评估器 (https://github.com/silentmatt/expr-eval)。

示例表达式为:

x = 10; 2 + (4*x)

出于安全考虑,我们也应该在服务器端验证计算结果。因此,我想在提交表单后,使用 PHP 在服务器上重新运行传入数据的计算。

我该怎么做? expr-eval 具有很多可能性,例如三元条件、变量声明等。由于 PHP 没有等效的库,那么运行这样的验证的方式是什么?我可以设置一个运行 expr-eval 的 Node.js 服务器,但是额外的请求真的是这里的最佳实践吗?

php security math evaluation
1个回答
0
投票

Eval 会做你需要的大部分事情,但是:

  • 它没有按照您需要的方式处理变量
  • 如果你允许“任何”不是算术运算符或数字的东西被“评估”,那么该代码就是可利用的。
即你需要非常严格地定义你的语法,实现你自己的解析器,然后将最终的表达式交给 eval。

类似......

function safer_eval($expr) { $facts=array(); $result=false; $lines=explode(";", $expr); foreach ($lines as $l) { $p=explode('=', $l); switch (count($p)) { case 2: $facts[$p[0]]=evalexpr($p[1], $facts); break; case 1: return evalexpr($p[0], $facts); break; default: break 2; } } return false; } function evalexpr($expr, $facts) { $expr=str_replace(array_keys($facts), $facts, $expr); if (!preg_match("/^([0-9+-/*\.\(\)\^ )/", $expr)) { return false; } return eval($expr); }
    
© www.soinside.com 2019 - 2024. All rights reserved.