【问题标题】:Security implications of writing files using PHP使用 PHP 编写文件的安全隐患
【发布时间】:2010-04-15 09:59:39
【问题描述】:

我目前正在尝试使用 PHP 创建一个 CMS,纯粹是为了教育。我希望管理员能够创建内容,这些内容将被解析并以纯 HTML 形式保存在服务器存储中,以避免执行 PHP 脚本产生的开销。不幸的是,我只能想到几种方法:

  • 在 CMS 应该写入文件的每个目录上设置写入权限。这听起来是个很糟糕的主意。
  • 在单个cached 目录上设置写权限。然后,PHP 脚本可以在请求时 includefopen/fread/echo 来自 cached 目录中的文件的内容。这也许可以以 Mediawiki 式的方式进行:像index.php?page=xyz 这样的东西可以在运行时从cached/xyz.html 读取和回显内容。但是,我需要确保 $_GET['page'] 的健全性,以防止像 index.php?page=http://www.bad-site.org/malicious-script.js 这样的讨厌的变化。

我个人对第二个想法不太感兴趣,但第一个听起来很不安全。有人可以建议一个完成这项工作的好方法吗?

编辑:我不赞成从数据库中获取数据。我唯一想从数据库中获取数据的时候是缓存内容的时候。其次,我无权访问 memcached 或任何 PHP 加速器。

【问题讨论】:

    标签: php security caching


    【解决方案1】:

    由于您正在构建 CMS,因此您必须接受这样的事实:如果用户想要对访问者做坏事,他们很可能会这样做。无论您将内容存储在何处,都是如此。

    如果公共站点都是静态内容,让 CMS 直接写入文件没有任何问题。但是,您需要将 Web 服务器配置为不执行任何可由 CMS 写入的目录中的任何内容。

    即使您不想每次都访问数据库,您也可以设置缓存以最小化数据库读取。 Zend_Cache 非常适合这一点,并且可以非常有效地用作独立组件。

    【讨论】:

    • +1 用于提及执行权限。但是,我不同意您的第一点 - 您可以根据需要限制编辑器的功能(例如通过剥离 javascript)。此外,您需要保护的不仅仅是访问者,还有服务器的完整性。
    • 绝对!限制有意义的事情,但归根结底,用户仍然可以制作一个网页,上面写着“我是 Jon Foo,最近被废黜的尼日利亚国王的兄弟,我需要你的帮助将 4200 万美元转移到美国...”就保护服务器而言,只要确保您只在允许您写入文件的地方写入文件,并且不要让 Web 服务器将其中的任何内容视为脚本。我并不是要让这些听起来微不足道 - 需要做很多仔细的工作 - 但据我估计,这并不是天生不安全的。
    • 我想,对访问者做坏事的用户应该不是问题,因为内容将由受信任的一群人添加和缓存。我很好奇公共目录的写权限是否会被恶意访问者用作潜在漏洞。感谢您指出执行部分!我目前无法真正设置缓存,因为预算是一个非常关键的问题,我们很可能会选择一个为我们提供合理带宽的 PHP/MySQL 的托管计划。
    【解决方案2】:

    您应该将页面放入数据库并使用参数化 SQL 查询检索它们。

    【讨论】:

    • 正如我上面提到的,我试图减少脚本的执行时间。我敢肯定,往返数据库会有点贵!我无权访问 PHP 加速器或 memcached。我想我也会将其编辑到问题中!
    【解决方案3】:

    我会选择第二个选项,但要对其进行修改,以便使用 mod_rewrite 而不是自定义 php 函数来检索文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 2012-03-28
      相关资源
      最近更新 更多