PHP这段代码是否安全?

时间:2017-05-09 08:49:03

标签: php

我正在尝试实现一个函数,你可以将公式传递给一个数组,它将成为公式的变量,但由于它的工作方式我必须使用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真的不安全,即使有这些小的“保护”但是,我现在想知道如何为人们输入一个公式和变量可能是其中一部分的功能它是为了得到评估,所以有任何好的提示吗?

1 个答案:

答案 0 :(得分:2)

总之,“不”。您的代码甚至不够安全。

eval可以按字面意思运行任何PHP代码,因此有几乎无限的方法可以造成巨大的破坏;脱离我的头顶:

  • 使用unlink删除服务器中的文件
  • 阅读/etc/passwd或源代码
  • 使用您自己的数据库代码访问数据库的全部内容
  • 使用curl_exec或FTP或SOAP
  • 将上述任何内容上传到攻击者的服务器
  • 将您用作mail()功能
  • 的垃圾邮件中继
  • 使用system,这与exec
  • 非常相似
  • 在字符串中使用嵌套的eval来逃避黑名单(例如eval('ex'+'ec(\'somecommand\')')

本课程的道德是从不使用安全黑名单。如果您的公式足够简单,您可能能够以所有公式必须满足的模式的形式定义非常仔细的白名单。但是,您可能仍然对创造性攻击持开放态度,并且可能更好地完全解析公式并在没有eval的情况下对其进行评估。