安全地评估简单的数学

2024-06-02

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

2+2
10000+12000
10000-20
2 + 2
40 - 20 + 23 - 12

无需使用eval()因为输入可以来自任何用户。我需要实现的只是整数的加法和减法。

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


我会质疑使用eval,考虑到 PHP 中可用的各种数学函数。你说过你只想做简单的数学——这是使用的唯一原因eval是执行更复杂的操作,或者完全接受用户的方程。

如果您只想加或减,请使用以下命令清理输入intval并进城:

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

Try it: http://codepad.org/LSUDUw1M http://codepad.org/LSUDUw1M

这有效是因为intval忽略任何非数字。

如果您确实从用户输入中获得了整个方程(即100 - 20), 您可以使用preg_replace删除除允许的运算符和数字之外的任何内容:

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

Try it: http://codepad.org/tnISDPJ3 http://codepad.org/tnISDPJ3

在这里,我们使用正则表达式/[^0-9+-]/,它匹配任何 NOT 0-9 OR + OR - 并将其替换为空字符串。

如果您想更深入地了解允许的方程,请直接取自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_replace - http://php.net/manual/en/function.preg-replace.php http://php.net/manual/en/function.preg-replace.php
  • intval - http://php.net/manual/en/function.intval.php http://php.net/manual/en/function.intval.php
  • eval - http://php.net/manual/en/function.eval.php http://php.net/manual/en/function.eval.php
  • PHP 数学函数 -http://www.php.net/manual/en/ref.math.php http://www.php.net/manual/en/ref.math.php
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全地评估简单的数学 的相关文章

随机推荐

  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • Symfony2 - 在自定义验证器中调用 EmailValidator

    我正在创建一个自定义验证器约束来验证 联系人 类似于 John Doe 电子邮件受保护 gt 遵循Cookbook http symfony com doc current cookbook validation custom constr
  • Google Drive V3、Google API 客户端 2.0 - 批量上传失败

    使用 Google Drive V3 和 API v2 0 主分支进行批量上传失败 我已经修改了https github com google google api php client blob master examples batch
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 为什么我无法对自定义属性(又名 CSS 变量)进行动画处理?

    看这个动画 金色 div 有一个自定义属性动画的动画 keyframes roll o 1动画 o 这是分步动画的 银色 div 有一个动画 其中normal属性是动画的 keyframes roll o 2动画left 这会持续动画 为什
  • 如何向开关对象添加/更改波纹效果

    下面是我自定义的开关 红圈是默认的波纹效果 我发现设置一个波纹可绘制作为开关的背景 控制波纹的颜色
  • 如何在MUI GridList中实现图块的水平滚动?

    这是我的 JS 页面 我需要在其中实现GridList组件显示多个图块 并且在列表大小超出屏幕限制后可水平滚动 import React useState from react import Header from common heade
  • 如何使用 jenkins pipeline 共享库定义全局变量或常量?

    虽然我能够定义方法 但使用 Jenkins 共享库定义变量似乎是迄今为止尚未解决的任务 I added vars True groovy有了这个身体 def call return true 现在在 Jenkinsfile 中 我尝试测试它
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • 在单元测试中运行 Airflow 1.9 的测试 Dag

    我已经实现了运行单个 dag 的测试用例 但它似乎在 1 9 中不起作用 可能是由于气流 1 8 中引入了更严格的池 我正在尝试运行以下测试用例 from airflow import DAG from airflow operators
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 未知的表引擎“InnoDB”

    最近 我发现如果我有好的硬件 我可以最大限度地提高 mysql 的性能 由于我一直在使用 InnoDB 所以我在 my ini 中添加了额外的配置 以下是新添加的配置 innodb data file path ibdata1 10M au
  • mysql:返回右侧第一个出现的子字符串? (子字符串?!)

    有没有办法返回sql中字符串右侧第一次出现的空格 我想你正在寻找类似的东西SUBSTRING INDEX http dev mysql com doc refman 5 0 en string functions html function
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • 将全局标题添加到 Plots.jl 子图

    我想使用 Plots jl 向一组子图添加全局标题 理想情况下 我会做类似的事情 using Plots pyplot plot rand 10 2 plot title Main title title A B layout 2 但是 根
  • 安全地评估简单的数学

    我想知道是否有一种安全的方法来评估数学 例如 2 2 10000 12000 10000 20 2 2 40 20 23 12 无需使用eval 因为输入可以来自任何用户 我需要实现的只是整数的加法和减法 是否有任何已经存在的代码片段 或者