【问题标题】:How do you permit PHP to write to a file without compromising server security如何允许 PHP 在不影响服务器安全的情况下写入文件
【发布时间】:2012-03-04 22:11:54
【问题描述】:

每当我想让 PHP 脚本将输出写入服务器上的文件时,我经常会遇到否定的 cmets。

我使用fopen()fwrite()fclose() 函数。

我知道如何做到这一点的唯一方法是将输出文件的权限设置为 0666 或将其归“nobody”所有(这是 PHP 在我们的 Apache Web 服务器上运行的用户)。

那么,如果“0666”或“由任何人拥有”是安全风险,您如何成功且安全地允许 PHP 脚本写入文件?

感谢您分享有关此主题的指导。

【问题讨论】:

  • 请解释您如何通过允许您自己的脚本写入文件来“损害服务器安全”。写入数据库是否也存在安全风险?只要确保您的代码没有安全漏洞。只要事情做对了,就没有问题。
  • @Flukey ...这就是我提出问题的目的。我没有清楚地看到这个问题。但是每当我提到我在服务器上有一个 0666 文件或运行 PHP 的用户拥有的文件时,我都会收到类似于..."的警告 cmets,当然你知道你正在打开你的服务器以确保安全风险”。我只是想在不影响服务器安全的情况下编写有效的脚本。
  • 只要写入的文件位于公共 Apache 目录之外,我就没有发现问题。他们的cmets是无知的。
  • (@Flukey) 啊哈....那么也许我们越来越接近问题的核心了。他们的 cmets 并非无知,因为该文件实际上位于公共 Apache 目录中。
  • 因此,换句话说,如果文件为“nobody”所有,但位于公共 Apache 目录之外,则不存在安全问题——当然,前提是我的 PHP 脚本什么都不做在自身内部危及服务器安全?请原谅我可能会认为 SysAdmins 是一个愚蠢的问题,但我是开发人员而不是 SysAdmin(但我担心我的服务器的安全性)。

标签: php apache permissions fwrite file-ownership


【解决方案1】:

如果您需要在上传文件后从 PHP 访问文件,则需要使用允许 Web 服务器(在本例中为 apache)访问它们的权限来存储它们。人们所说的风险是您网站上的某些脚本可能会被欺骗以提供文件。这是一种假设性风险,但许多内容管理系统都发生过这种风险。为了降低这种风险:

  1. 使文件名和路径不易被猜到。如果用户有到getfile.php?file=1.txt 的路径,他们可以很容易地推断出也有2.txt。加密名称或使其不排序。
  2. 让任何提供文件的脚本确认登录用户、对资源的授权等内容,并从包含路径的文件名中删除任何内容,以避免对/etc/passwd 的恶意引用等。

如果您只需要删除文件并且不再提供它或再次通过 PHP 访问它,那么您还有更多选择。使用chmodchown 命令使其对apache 用户不可读。如果您想更加偏执,请使用 cron 脚本将文件移动(并重命名)到 PHP 源代码中未知的位置。至少,如果你的服务器被黑客入侵,入侵者就无法直接进入目录,但我们正接近讨论转向操作系统安全的地步。

【讨论】:

  • 感谢@DuaneGran。我将通读您的答案并在不久后更彻底地消化它。但我的第一反应是“哈希名称”是什么意思?而且,您如何做到这一点并在脚本中仍然使用它?
  • @Dr.DOT 我错误地建议使用哈希,因为这是一种方法。我的错。碰巧,这个最近的问题有关于适用于文件名的简单加密/解密函数的答案:stackoverflow.com/questions/9262109/…
【解决方案2】:

风险在于,如果该可写目录位于外部世界可访问的区域中。然后那些拥有正确工具并知道如何将他们想要的任何内容写入该目录......或文件的人。然后他们可以将恶意软件放入其中或在您的网站上创建网络钓鱼方案。

真的,他们可以做各种各样的事情来损害你。我在自己的服务器上看到过这种情况,但还没有真正找到正确的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多