1

我承认标题主要是第 22 条,但它是完全相关的,所以请耐心等待我...

背景

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

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

问题

这个 [调试系统] 非常适合开发服务器,但您绝对不能在生产服务器上使用它,因为调试详细信息(包括数据库凭据等)会公开发布。老实说,谁曾经从开发者那里迁移过来。到一个刺激。服务器每次都完美无瑕?

解决方案

因此,我一直在想办法解决这个问题。我提出的解决方案包括:

  • 有一个设置告诉框架仅当请求来自某个 IP 时才启用日志记录。这样做的安全问题非常明显(IP 欺骗等)。
  • 有一个包含 PHP 表达式(代码)的设置,该表达式(代码)被 eval'd 并且它的返回用作是/否。最好的部分是安装的框架可能会建议特定于 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,或其他任何方式。

在此处输入图像描述

4

4 回答 4

3

前进。很明显,您了解假设的安全含义。在您的情况下,告诉目标用户群很重要。

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

您看到的唯一问题是性能。那是胡扯。没什么大不了。的存在eval就是将脚本语言与编译语言区分开来的原因。如果它可用,您不仅可以使用它,而且可以确保它不会变慢,因为需要在后台运行编译器+链接器。PHP 需要一些时间来初始化它的标记器和解析器,但解析本身的速度非常快。

最后,避免在 SO 上使用此类问题标题。;}或者至少create_function请谈谈。

于 2011-04-05T23:04:29.280 回答
2

允许以自由形式输入执行的 PHP 代码——无论是通过eval()还是create_function()——都是糟糕的设计,并且无缘无故地打开了一个巨大的潜在漏洞。它还打开了通过语法错误使页面崩溃的可能性。

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

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

这是你的电话。很有可能你永远不会因为这样做而遇到问题eval()。并且可以说,您将连接的大多数 CMS(Wordpress、Joomla)无论如何都允许在后端任意执行 PHP 代码。但这不是好的设计。

于 2011-04-05T22:52:02.420 回答
2

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

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

于 2011-04-05T22:41:22.510 回答
0

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

eval()如果任何函数不存在或出现任何数量的解析错误,可能会使您的页面崩溃。如果存在允许用户提供的输入(例如请求的 uri)甚至触及这些评估值的错误,则可能会使您的网站遭到恶意或意外破坏。而不是识别当前工作的框架,在您尝试桥接的框架中查找标记,例如某些常量、函数、类等。您可以使用,等将所有eval()函数替换为安全检查。function_exists()defined()

于 2011-04-05T22:53:49.957 回答