我正在接管一些在 php中使用eval()函数的网页游戏代码。我知道这可能是一个严重的安全问题,所以在我决定是否取消这部分代码之前,我需要一些帮助来审查检查其参数的代码。目前我已经从游戏中删除了这部分代码,直到我确定它是安全的,但功能的损失并不理想。我宁愿安全证明这一点,也不愿重新设计整个段以避免使用 eval(),假设这样的事情是可能的。据称可以防止恶意代码注入的相关代码片段如下。$value 是一个用户输入的字符串,我们知道它不包含“;”。
1 $value = eregi_replace("[ \t\r]","",$value);
2 $value = addslashes($value);
3 $value = ereg_replace("[A-z0-9_][\(]","-",$value);
4 $value = ereg_replace("[\$]","-",$value);
5 @eval("\$val = $value;");
到目前为止,这是我的理解:
1) 从 $value 中删除所有空格
2)转义数据库调用需要它的字符(我不清楚为什么需要它)
3) 查找紧跟 \ 或 ( 的字母数字字符,并将它们的组合替换为 -。大概这是为了删除字符串中任何类似函数调用的内容,尽管我不清楚为什么它还会删除前面的字符,这就是为什么在第 2 行明确添加它们之后,它也会删除 \。
4) 用 - 替换所有 $ 实例,以避免在字符串中出现任何类似对 php 变量的引用。
那么:这里有没有留下任何漏洞?我误解了上面的任何正则表达式吗?最后,有没有办法在不排除 ( 字符的情况下进行安全证明?要输入的字符串理想地是一个数学公式,并且允许 ( 将允许操作操作顺序,这目前是不可能的。