【发布时间】:2012-03-22 01:39:03
【问题描述】:
让我先说我很清楚在服务器环境中运行用户提供的代码是有风险的。幽默一下 - 我的问题是特定于字符串评估和可以在该上下文中执行的语言子集。
所以我现在正在构建一个模板生成系统,我希望它快。超级,超级,超级快。这件事会因为大量电子邮件邮寄和类似的事情而受到抨击。我使用的方法是让用户提供用户输入的模板标签,这些标签在存储之前通过正则表达式转换为 PHP 变量替换。假设我的正则表达式是防弹的,你觉得这个过程的安全性可以接受吗?
- 模板由用户输入,带有
[[contact.name]]等标签。 - 保存后,正则表达式将这些转换为 PHP 变量,因此上述通配符在模板字符串中变为
{$contact['name']}。 - 我们还会检查是否存在任何可以从超全局范围转换为可访问变量的内容,因此
[[_SERVER]]、[[GLOBALS]]等以及[[this都被禁止并记录为黑客尝试。 - 在双引号字符串(
$、"和\)中具有特殊含义的其他字符也会被转义。 - 生成过程如下:
- generation 是一个运行的类方法。传入的唯一变量是
$contact,它是一个数组。 - 模板字符串被读入另一个局部变量(在本例中为
$__templateString)。理论上,用户可以在他们的模板中访问这个变量,但他们是否这样做并不重要 - 没有安全风险,只是愚蠢。 - 生成模板的代码就是
eval('return "' . $__templateString . '";');
- generation 是一个运行的类方法。传入的唯一变量是
我在这里缺少任何漏洞吗?我很确定唯一的潜在风险是范围访问问题,而且我认为我已经涵盖了那里的所有基础。
【问题讨论】:
-
我不知道,但是像键盘这样的地方可以。我经常想知道怎么做。
-
@Dagon github.com/Viper-7/Deployable-PHP-Codepad chrooting 并锁定执行脚本的用户的系统权限。它比
eval更精细。 -
如果你想要快速和安全的东西,那么你应该使用handelbars 并使用hiphop 编译你的PHP,我们真的不需要另一个聪明人。
标签: php security user-input