使用eval()增强安全性

时间:2011-04-05 21:58:36

标签: php security debugging eval k2f

我承认标题主要是一个标题22,但它完全相关,所以请耐心等待一段时间......

背景

有些人可能知道,我正在开发一个PHP框架,其主要卖点是在不同的CMS /系统之间桥接功能。 从开发人员的角度来看,有一个广泛的错误处理和日志记录机制。 现在,有两个设置DEBUG_MODEDEBUG_VERBOSE,它们控制调试输出。

该模式描述了medium和verbose控制细节的数量。 简而言之,有一种称为“控制台”的模式,它基本上将调试信息转储到javascript控制台(现在可以在你附近的主要Web浏览器中使用)。

问题

此[调试系统]适用于开发服务器,但由于调试详细信息(包括数据库凭据等)公开发布,因此绝对无法在生产服务器上使用它。老实说,每次从 dev。迁移到 prod。服务器的人都完美无缺?

解决方案

因此,我一直试图找到解决这个问题的方法。我提出的解决方案包括:

  • 有一个设置,告诉框架只有在请求来自某个IP时才启用日志记录。这方面的安全问题非常明显(IP欺骗等)。
  • 设置包含得到eval'd的PHP表达式(代码),并将其返回用作是/否。最好的部分是安装的框架可能会建议CMS特定的表达式,例如:
    • Wordpress:current_user_can('manage_options')
    • Joomla:$user=&JFactory::getUser() && ($user->usertype=='Super Administrator') || ($user->usertype=='Administrator')
    • 自定义:$_SERVER['REMOTE_ADDR']=='123.124.125.126'
  • 这两者是其中之一,我渴望听到更多建议。

那么,您认为eval()应该达到吗?我确保每页加载/请求只执行一次,它仍然表现良好。

澄清

if(DEBUG_MODE!='none')echo 'Debug'; // this is how it is now
if(DEBUG_MODE!='none' && $USER_CONDITION)echo 'Debug'; // this is how it should be

$USER_CONDITON允许运行is_admin()等内容以允许所有管理员查看调试信息,或getUser()->id==45为特定用户启用它。或者通过IP或其他任何方式。

enter image description here

4 个答案:

答案 0 :(得分:3)

继续。很明显,您了解假设的安全隐患。在您的情况下,告诉目标用户群是非常重要的。

至于你的方法的实用性,真的没有讨论。您需要变量身份验证逻辑,并且不能将其硬连线到一个特定的环境/ cms运行时。

您唯一关注的是性能问题。那是胡扯。这不是问题。 eval的存在是从编译语言中识别脚本语言的原因。如果它可用,你不仅可以使用它,而且可以确保它会变慢,因为在后台需要运行编译器+链接器。 PHP需要一些时间来初始化其标记化器和解析器,但解析本身的速度非常快。

最后,在SO上避免这样的问题标题。 ;}或者至少请谈谈create_function

答案 1 :(得分:2)

IP欺骗时间足以实际获得响应的可能性不大。如果用户设法建立与服务器的连接,欺骗内部或特权开发人员IP,他们控制您的路由器,所以您还有其他事情需要担心。

而不是运行eval你不能只写一个匿名函数/闭包:http://php.net/manual/en/functions.anonymous.php (把它放在配置文件中,而不是网页屏幕上,在网络表单上编写复杂的PHP代码似乎不太理想)

答案 2 :(得分:2)

允许执行的PHP代码的自由格式输入 - 无论是通过eval()还是create_function() - 只是糟糕的设计,并且没有充分理由打开一个巨大的潜在漏洞。它还可以通过语法错误打开页面崩溃的可能性。

即使是管理员无论如何都可以安装插件的论点并不完全,因为XSRF攻击可以设想将恶意内容放入文本字​​段(一个请求),但不能触发插件安装。

所以不,我不会这样做;我会将每个CMS桥实现为适配器,并让用户从预定义列表中选择适配器(如果需要,还可以输入一些自定义,可消毒的设置)。 (@Wrikken在评论中也提出了类似的建议)

这是你的电话。有可能以eval()方式执行此操作永远不会有问题。可以说,您将要连接的大多数CMS(Wordpress,Joomla)允许在后端中随意执行PHP代码。但这不是好设计。

答案 3 :(得分:0)

有一个包含PHP表达式(代码)的设置被eval'd并且它的返回被用作是/否。最好的部分是安装的框架可能会建议CMS特定的表达式,例如:

如果任何函数不存在或任何数量的解析错误,

eval()可能会导致页面崩溃。如果存在允许用户提供的输入(例如请求的uri)甚至触及这些被证实的值的错误,它可能会打开您的网站以进行恶意或意外破坏。而不是识别当前工作的框架,在您尝试桥接的框架中查找标记,例如某些常量,函数,类等。您可以使用{{{{}}替换所有eval()函数并使用安全检查1}},function_exists()