我承认标题主要是一个标题22,但它完全相关,所以请耐心等待一段时间......
有些人可能知道,我正在开发一个PHP框架,其主要卖点是在不同的CMS /系统之间桥接功能。
从开发人员的角度来看,有一个广泛的错误处理和日志记录机制。
现在,有两个设置DEBUG_MODE
和DEBUG_VERBOSE
,它们控制调试输出。
该模式描述了medium和verbose控制细节的数量。 简而言之,有一种称为“控制台”的模式,它基本上将调试信息转储到javascript控制台(现在可以在你附近的主要Web浏览器中使用)。
此[调试系统]适用于开发服务器,但由于调试详细信息(包括数据库凭据等)公开发布,因此绝对无法在生产服务器上使用它。老实说,每次从 dev。迁移到 prod。服务器的人都完美无缺?
因此,我一直试图找到解决这个问题的方法。我提出的解决方案包括:
current_user_can('manage_options')
$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或其他任何方式。
答案 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()
等