让我先说一下,我很清楚在服务器环境中运行用户提供的代码是有风险的。幽默我 - 我的问题是特定于字符串评估和可以在该上下文中执行的语言子集。
所以我现在正在构建模板生成系统,我希望它能够快速实现。超级,超级,超级快。对于大量的电子邮件邮件和这种事情,这件事情会受到打击。我正在使用的方法是让用户提供用户输入的模板标签,在存储之前通过正则表达式转换为PHP变量替换。假设我的正则表达式是防弹的,你觉得这个过程的安全性是否可以接受?
[[contact.name]]
等类似的标签。{$contact['name']}
。 [[_SERVER]]
,[[GLOBALS]]
等以及[[this
都被禁止并记录为黑客企图。$
,"
和\
中具有特殊含义的字符也会被转义。$contact
,它是一个数组。$__templateString
)。理论上,用户可以在他们的模板中访问这个变量,但是如果他们这样做并不重要 - 不是安全风险,只是愚蠢。eval('return "' . $__templateString . '";');
我在这里缺少什么洞?我很确定唯一的潜在风险是范围访问问题,我想我已经涵盖了我的所有基础。
答案 0 :(得分:1)
那么如果我输入这个模板怎么办:
" . mysql_query('DROP TABLE users') . "
很高兴你能防止可能访问变量你不希望别人访问,但eval
评估所有代码,而不仅仅是变量。并尝试找到一个正则表达式来过滤掉...
答案 1 :(得分:1)
轶事:当我是Linux发行版的安全联系人时,PHP开发人员要求我们停止在格式错误的输入“安全漏洞”上调用解释器崩溃。他们坚持认为,提供脚本的人是100%信任的,我完全希望eval()
能够以同样的方式处理。
您可以尝试修补问题,但我当然不会向无限用户开放输入。你忽略翻译崩溃错误的可能性太大了。
此外,请考虑使用mandatory access control,AppArmor,SELinux或TOMOYO等SMACK系统进行部署。这样你就可以restrict the potential damage from a hacked input to the minimal amount of resources necessary to do the work in the first place。 (自2000年以来我一直在使用AppArmor,因此它是我在许多环境中的首选。但考虑到其他环境,它们都是高质量的产品,旨在解决不同的问题,而且这些产品可能更适合您的环境。)