我们的用户可以根据表单字段进行数学计算。为了评估计算,我使用 expr-eval 作为 javascript(客户端)的表达式评估器 (https://github.com/silentmatt/expr-eval)。
示例表达式为:
x = 10; 2 + (4*x)
出于安全考虑,我们也应该在服务器端验证计算结果。因此,我想在提交表单后,使用 PHP 在服务器上重新运行传入数据的计算。
我该怎么做? expr-eval 具有很多可能性,例如三元条件、变量声明等。由于 PHP 没有等效的库,那么运行这样的验证的方式是什么?我可以设置一个运行 expr-eval 的 Node.js 服务器,但是额外的请求真的是这里的最佳实践吗?
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);
}