PHP安全性:评估用户输入的字符串的风险

时间:2012-03-22 01:39:04

标签: php security user-input

让我先说一下,我很清楚在服务器环境中运行用户提供的代码是有风险的。幽默我 - 我的问题是特定于字符串评估和可以在该上下文中执行的语言子集。

所以我现在正在构建模板生成系统,我希望它能够快速实现。超级,超级,超级快。对于大量的电子邮件邮件和这种事情,这件事情会受到打击。我正在使用的方法是让用户提供用户输入的模板标签,在存储之前通过正则表达式转换为PHP变量替换。假设我的正则表达式是防弹的,你觉得这个过程的安全性是否可以接受?

  • 模板由用户输入,使用[[contact.name]]等类似的标签。
  • 保存后,regex将这些转换为PHP变量,因此上面的通配符在模板字符串中变为{$contact['name']}
  • 我们还检查是否存在可以从超全局范围转换为可访问变量的任何内容,因此[[_SERVER]][[GLOBALS]]等以及[[this都被禁止并记录为黑客企图。
  • 其他在双引号字符串($"\中具有特殊含义的字符也会被转义。
  • 生成过程如下:
    • generation是一个运行的类方法。传入的唯一变量是$contact,它是一个数组。
    • 模板字符串被读出到另一个局部变量(在本例中为$__templateString)。理论上,用户可以在他们的模板中访问这个变量,但是如果他们这样做并不重要 - 不是安全风险,只是愚蠢。
    • 生成模板的代码就是eval('return "' . $__templateString . '";');

我在这里缺少什么洞?我很确定唯一的潜在风险是范围访问问题,我想我已经涵盖了我的所有基础。

2 个答案:

答案 0 :(得分:1)

那么如果我输入这个模板怎么办:

" . mysql_query('DROP TABLE users') . "

很高兴你能防止可能访问变量你不希望别人访问,但eval评估所有代码,而不仅仅是变量。并尝试找到一个正则表达式来过滤掉...

答案 1 :(得分:1)

轶事:当我是Linux发行版的安全联系人时,PHP开发人员要求我们停止在格式错误的输入“安全漏洞”上调用解释器崩溃。他们坚持认为,提供脚本的人是100%信任的,我完全希望eval()能够以同样的方式处理。

您可以尝试修补问题,但我当然不会向无限用户开放输入。你忽略翻译崩溃错误的可能性太大了。

此外,请考虑使用mandatory access controlAppArmorSELinuxTOMOYOSMACK系统进行部署。这样你就可以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,因此它是我在许多环境中的首选。但考虑到其他环境,它们都是高质量的产品,旨在解决不同的问题,而且这些产品可能更适合您的环境。)