首先我要说的是,我很清楚在服务器环境中运行用户提供的代码是有风险的。幽默一下 - 我的问题特定于字符串评估以及可以在该上下文中执行的语言子集。
所以我现在正在构建一个模板生成系统,我希望它能够快速运行。 super , super , super 快。这件事将会因为大量的电子邮件邮件和类似的事情而受到打击。我使用的方法是让用户提供用户输入的模板标签,这些标签在存储之前通过正则表达式转换为 PHP 变量替换。假设我的正则表达式是防弹的,您觉得这个过程的安全性可以接受吗?
- 模板由用户输入,带有
[[contact.name]]
等标签。 - 保存后,正则表达式会将它们转换为 PHP 变量,因此上述通配符在模板字符串中变为
{$contact['name']}
。 - 我们还会检查是否存在可以从超全局范围转换为可访问变量的任何内容,例如
[[_SERVER]]
、[[GLOBALS]]
等以及[[this
]都被禁止并记录为黑客尝试。 - 双引号字符串中具有特殊含义的其他字符(
$
、"
和\
)也会被转义。 - 生成过程如下:
- Generation 是一个运行的类方法。传入的唯一变量是
$contact
,它是一个数组。 - 模板字符串被读入另一个局部变量(在本例中为
$__templateString
)。理论上,用户可以在模板中访问此变量,但是否这样做并不重要 - 不是安全风险,只是愚蠢。 - 生成模板的代码很简单
eval('return "' . $__templateString . '";');
- Generation 是一个运行的类方法。传入的唯一变量是
我这里有什么遗漏的地方吗?我非常确定唯一的潜在风险是范围访问问题,而且我认为我已经涵盖了所有基础知识。
最佳答案
如果我输入这个模板又怎么样:
" . mysql_query('DROP TABLE users') . "
很高兴您能够防止对您不希望人们访问的变量的可能访问,但是eval
会评估所有代码,不仅仅是变量。并尝试找到一个正则表达式来过滤掉它......
关于PHP安全: risks in evaluating a user-entered string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815317/