【问题标题】:PHP security: risks in evaluating a user-entered stringPHP 安全性:评估用户输入字符串的风险
【发布时间】:2012-03-22 01:39:03
【问题描述】:

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

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

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

我在这里缺少任何漏洞吗?我很确定唯一的潜在风险是范围访问问题,而且我认为我已经涵盖了那里的所有基础。

【问题讨论】:

  • 我不知道,但是像键盘这样的地方可以。我经常想知道怎么做。
  • @Dagon github.com/Viper-7/Deployable-PHP-Codepad chrooting 并锁定执行脚本的用户的系统权限。它比eval 更精细。
  • 如果你想要快速和安全的东西,那么你应该使用handelbars 并使用hiphop 编译你的PHP,我们真的不需要另一个聪明人。

标签: php security user-input


【解决方案1】:

如果我输入这个模板呢:

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

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

【讨论】:

  • 那很好,因为我在将双引号放回它们之间之前从字符串中转义了双引号。因此,以上所有内容都将完全按照模板中的内容输出。
  • 好的,然后{$(mysql_query()}}That's valid in strings. 我想主要是试图锁定eval 是一场艰苦的战斗。您必须了解所有可能的代码执行方式(其中有很多),并且您必须尝试使用​​会出现异常的正则表达式锁定每一个例外。您只对eval 的一小部分感兴趣,但需要与最后一个不受欢迎的副作用作斗争。这不是一种理智的发展方式。
  • 哦,不错。我不知道语法是可能的。但实际上,我知道这不是一个特别理智的方法,但理论上关于字符串解析的页面应该是确保它安全所需的唯一信息(我应该一直阅读到底部在来这里之前,坏我)。我知道人们原则上总是避免这种事情,但我觉得如果你是一名语言老手并且有足够的信心尝试它,那为什么不呢?你只需要准备好以后吃你的话,事实证明你不应该这么自大。
  • 作为一名语言老手 (;-)) 我的建议是避免这种艰苦的战斗。这只是意味着你必须编写很多代码,你必须非常非常有信心才能锁定eval,而你可以另辟蹊径,编写一些有效或无效的代码。而且我敢打赌,您甚至不会看到性能上的重大差异。
  • 公平通话.. 我将使用简单的 str_replace 对其进行测试,看看效果如何。但我想我可能会暂时离开它,稍后前往 C-land 并在发布前将它作为一个模块实现。如果您想使用该函数语法和指向字符串解析页面的链接更新您的原始答案,我会将其标记为接受/赞成(:
【解决方案2】:

轶事胡言乱语:当我是 Linux 发行版的安全联系人时,PHP 开发人员要求我们停止将错误输入导致的解释器崩溃称为“安全漏洞”。他们坚信提供脚本的人是 100% 受信任的,我完全希望 eval() 以同样的方式处理。

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

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

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 2011-04-05
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多