我正在尝试实现一个函数,你可以将公式传递给一个数组,它将成为公式的变量,但由于它的工作方式我必须使用eval函数,我知道是不安全,所以我试图寻找可能的危险,并在某种程度上防止最麻烦的危险我确保它不会评估如果输入preg匹配exec或“,但是这是足够安全或在exec旁边有其他危险,我应该消除? 在这里我的代码:
<?php
function calc($formula,$variables){
extract($variables);
if(!preg_match('/"/',$formula) && !preg_match('/exec/',$formula)){
eval("\$formula=$formula;");
echo $formula;
}
}
calc('0.025*$r-($r-100000)*0.01',@array(r=>1000000));
?>
更新: 感谢到目前为止没有贬低,我知道这可能不是正确的地方,或者不是正确的方式,但我还是在努力解决如何问这个问题
此刻我发现您的评论eval真的不安全,即使有这些小的“保护”但是,我现在想知道如何为人们输入一个公式和变量可能是其中一部分的功能它是为了得到评估,所以有任何好的提示吗?
答案 0 :(得分:2)
总之,“不”。您的代码甚至不够安全。
eval
可以按字面意思运行任何PHP代码,因此有几乎无限的方法可以造成巨大的破坏;脱离我的头顶:
unlink
删除服务器中的文件/etc/passwd
或源代码curl_exec
或FTP或SOAP mail()
功能system
,这与exec
eval
来逃避黑名单(例如eval('ex'+'ec(\'somecommand\')')
本课程的道德是从不使用安全黑名单。如果您的公式足够简单,您可能能够以所有公式必须满足的模式的形式定义非常仔细的白名单。但是,您可能仍然对创造性攻击持开放态度,并且可能更好地完全解析公式并在没有eval
的情况下对其进行评估。