php - PHP:当只允许使用字母数字字符和运算符时,eval 函数是否足够安全?
问题描述
我正在考虑使用函数“eval”来评估用户生成的数学表达式。
但是,我被困住了。我知道如果我只允许数字和运算符(例如加号、减号等),那么 eval 是安全的。但是,我想让用户输入诸如 sin(x) 或 cos(x) 之类的函数,因此我需要允许解析器让字母进入。
安全吗?
用户能否输入仅包含字母数字字符和字符 {+、-、*、/}(不包括括号)的恶意代码?
谢谢你。
解决方案
安全吗?
很难说需要看到实施,这不是你问题的一部分。
所以在这一点上,一切皆有可能。可能是安全的,可能是不安全的,可能是一团糟,也可能是金色的。
用户能否输入仅包含字母数字字符和字符 {+、-、*、/}(不包括括号)的恶意代码?
类似地,这取决于许多不同的事情,也许首先你会认为是恶意代码。能够触发错误的代码?
它也可以取决于 PHP 版本。一些较旧的 PHP 版本允许使用自动转换为字符串的未定义常量。
由于数字是允许的,一个允许的字符可能是.
(点),它也是 PHP 中的字符串连接运算符,可能会导致您认为是恶意的副作用。
在您的具体情况下,为什么不查看已经建议的https://github.com/madorin/matex是否符合您的要求?
eval
当您脱离等式时,这一次可能会使最初的“评估安全”问题变得无关紧要。
推荐阅读
- node.js - GCE Node Api 使用没有外部 IP 的自定义网络
- c++ - 从 libssh2_sftp_readdir_ex() 检索文件名
- java - Java/IntelliJ:直接在代码旁边插入注释而不是在行首插入注释的快捷方式 [macOS]
- ios - 使用 Accelerate 框架进行双平面 YUV 4:2:0 像素操作
- json - 如何将邮递员的回复导出到布局清晰的 csv/xls 文件?
- azure - 如何将 Azure Pipeline 测试结果链接到测试用例
- reactjs - 服务器错误类型错误:firebaseApp.firestore 不是函数错误
- javascript - Javascript仅在点击时填充画布的某些部分
- angular - 如何为 Angular Web Worker 编译指定入口文件
- c++ - 如何让程序使用默认值(按 Return 键)并允许用户在那里输入自己的值?