Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP这段代码是否安全?_Php - Fatal编程技术网

PHP这段代码是否安全?

PHP这段代码是否安全?,php,Php,我试图实现一个函数,你可以将一个公式传递到一个数组中,这个数组将成为公式的变量,但是由于它的工作方式,我不得不使用eval函数,我知道这是不安全的,因此,我尝试研究可能的危险,并在某种程度上防止最麻烦的危险,我确保如果input preg与exec匹配,它不会进行评估,或者“然而,这是否足够安全,或者除了exec之外还有其他危险我应该消除吗?”? 这是我的代码: <?php function calc($formula,$variables){ extract($varia

我试图实现一个函数,你可以将一个公式传递到一个数组中,这个数组将成为公式的变量,但是由于它的工作方式,我不得不使用eval函数,我知道这是不安全的,因此,我尝试研究可能的危险,并在某种程度上防止最麻烦的危险,我确保如果input 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
可以运行任何PHP代码,因此有几乎无限多的方法可以造成巨大的破坏;在我的脑海中:

  • 使用
    取消链接
    从服务器中删除文件
  • /etc/passwd
    读取,或从源代码读取
  • 使用自己的数据库代码访问数据库的全部内容
  • 使用
    curl\u exec
    或FTP或SOAP将上述任何内容上载到攻击者的服务器
  • 使用
    mail()
    功能将您用作垃圾邮件中继
  • 使用
    系统
    ,这与
    exec
  • 在字符串中使用嵌套的
    eval
    来规避黑名单(例如
    eval('ex'+'ec(\'somecommand\'))
这一课的寓意是,永远不要使用黑名单进行安全保护。如果您的公式足够简单,您可能能够以所有公式都必须满足的模式定义一个非常仔细的白名单。不过,您可能仍然会受到创造性攻击,因此最好完全解析公式并进行评估不使用
eval

对其进行评估,一句话,“不”。您的代码甚至一点也不安全

eval
可以运行任何PHP代码,因此有几乎无限多的方法可以造成巨大的破坏;在我的脑海中:

  • 使用
    取消链接
    从服务器中删除文件
  • /etc/passwd
    读取,或从源代码读取
  • 使用自己的数据库代码访问数据库的全部内容
  • 使用
    curl\u exec
    或FTP或SOAP将上述任何内容上载到攻击者的服务器
  • 使用
    mail()
    功能将您用作垃圾邮件中继
  • 使用
    系统
    ,这与
    exec
  • 在字符串中使用嵌套的
    eval
    来规避黑名单(例如
    eval('ex'+'ec(\'somecommand\'))

这一课的寓意是,永远不要使用黑名单进行安全保护。如果您的公式足够简单,您可能能够以所有公式都必须满足的模式定义一个非常仔细的白名单。不过,您可能仍然会受到创造性攻击,因此最好完全解析公式并进行评估在没有
eval的情况下使用它

公式从何而来?为什么不正确定义$variables数组?
calc('unlink(\'*\');',[]));
将删除您的文件。该公式现在暂时在calc中定义,但稍后将从数据库中出来,然后在用户输入的另一个页面文件中,以便人们可以输入公式,然后输入变量,并向他们显示公式的解决方案,感谢关于取消链接的提示,这将成为另一个安全检查eded要实现\、;和“在不限制可能的输入公式的情况下,阻止更多函数正确启动,好吗?所以这个问题属于代码审查?我不知道我是否仍然可以把它放在那里,但没有问题是管理员做的,我不知道使用计算器。你添加另一个安全检查,攻击者会再次绕过它。阅读IMSoP的答案已经写好了,从来没有使用过黑名单来保证安全。即使你把IMSoP提到的所有东西都列入黑名单,也总会有其他你还没有想到的东西。公式是从哪里来的?为什么你没有正确定义$variables数组?
calc('unlink(\'*\');',[]));
将删除您的文件。该公式现在暂时在calc中定义,但稍后将从数据库中出来,然后在用户输入的另一个页面文件中,以便人们可以输入公式,然后输入变量,并向他们显示公式的解决方案,感谢关于取消链接的提示,这将成为另一个安全检查eded要实现\、;和“在不限制可能的输入公式的情况下,阻止更多函数正确启动,好吗?所以这个问题属于代码审查?我不知道我是否仍然可以把它放在那里,但没有问题是管理员做的,我不知道使用计算器。你添加另一个安全检查,攻击者会再次绕过它。阅读IMSoP的答案已经写好了,而且从不使用黑名单进行安全保护。即使你将IMSoP提到的所有事情都列入黑名单,也总会有其他你还没有想到的事情。好吧,那怎么办呢?因为我搜索得很辛苦,没有eval就找不到解决方案,特别是因为公式是人们需要的使用变量、括号和所有东西,“能够被放置”可能是非常顶级的,那么你对公式的评估有什么建议呢?@dylan-为什么不看看我最初为你链接的公式评估器呢?我查过了,但答案是oop,我对oop有点不熟悉,所以我还不知道发生了什么如果你不相信你能编写或维护一个表达式解析器,找一个库或工具为你做这件事,或者将你的规范限制在你有信心做的范围内,那么这将使我无法改变任何事情,如果我需要的话…@dylanlindelauf完全安全,但可能有比PHP更适合的语言来评估您的表达式