Php 安全评估简单数学

Php 安全评估简单数学,php,Php,我想知道是否有一种安全的方法来评估数学,比如 2+2 10000+12000 10000-20 2 + 2 40 - 20 + 23 - 12 无需使用eval(),因为输入可以来自任何用户。我需要实现的只是整数的加法和减法 是否有任何已经存在的代码片段,或者我没有遇到的任何PHP函数?您可以自己解析表达式 大概是这样的: // Minus is the same as plus a negative // Also remove spaces after minus signs $str =

我想知道是否有一种安全的方法来评估数学,比如

2+2
10000+12000
10000-20
2 + 2
40 - 20 + 23 - 12
无需使用
eval()
,因为输入可以来自任何用户。我需要实现的只是整数的加法和减法


是否有任何已经存在的代码片段,或者我没有遇到的任何PHP函数?

您可以自己解析表达式

大概是这样的:

// Minus is the same as plus a negative
// Also remove spaces after minus signs
$str = preg_replace('/-\s*(\d+)/', '+-$1', $str);

// Split on plusses
$nums = explode('+', $str);

// Trim values
$nums = array_map('trim', $nums);

// Add 'em up
echo array_sum($nums);

演示:

考虑到PHP中可用的各种数学函数,我会质疑使用
eval
。您说过您只想做简单的数学运算——使用
eval
的唯一原因是执行更复杂的运算,或者接受用户提供的公式

如果您只想进行加法或减法运算,请使用
intval
对输入进行清理,然后前往城镇:

$number1 = '100';
$number2 = 'shell_exec(\'rm -rf *\')';
echo intval($number1) + intval($number2); // 100
试试看:

这是因为
intval
忽略任何非数字的内容

如果您确实从用户输入中获得了整个等式(即
100-20
),则可以使用
preg\u replace
删除除允许的运算符和数字以外的任何内容:

$input = '20 + 4; shell_exec(\'rm *\')';
$input = preg_replace(
    '/[^0-9+-]/', 
    '',
    $input
);
eval('$result = '.$input.';');
echo 'result: '.$result; // 24
试试看:

这里,我们使用的是regex
/[^0-9+-]/
,它匹配任何不匹配0-9或+或-的内容,并用空字符串替换它

如果您想更深入地了解允许的方程式,请直接从
eval
手册页获取:

// credit for code to bohwaz (http://www.php.net/manual/en/function.eval.php#107377)
$test = '2+3*pi';

// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);

$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:abs|a?cosh?|a?sinh?|a?tanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns

if (preg_match($regexp, $q))
{
    $test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function
    eval('$result = '.$test.';');
}
else
{
    $result = false;
}
文档

  • preg\u replace
    -
  • intval
    -
  • eval
    -
  • PHP数学函数-

我在计算器脚本中使用了这个方法

$field1 = $_GET["field1"];
$field2 = $_GET["field2"];

$answer = $field1 + $field2;
echo "$field1 + $field2 = $answer";

你可以先清理输入(就像使用正则表达式只允许数字和数学运算符)你从用户输入中得到整个字符串吗?这个实际上不起作用,也不起我需要它做的作用。哦,但这个很好,但我不知道它在你的情况下是否不起作用..对不起..它实际上是在用相同的值添加一个值,基本上是x+x=y。好的,feild1=10和feild2=15是什么,很明显,答案是它们不相等?@Manhim:这只是一个例子。显然,每个
$\u GET
都应该得到一个不同的变量。我想我已经尝遍了评估的全部内容。我只是很快地把它拼凑起来,很高兴它有帮助:-)