如何允许PHP在不影响服务器安全的情况下写入文件

如何允许PHP在不影响服务器安全的情况下写入文件,php,apache,permissions,fwrite,file-ownership,Php,Apache,Permissions,Fwrite,File Ownership,每当我想让PHP脚本将输出写入服务器上的文件时,我经常会遇到负面评论 我使用fopen()、fwrite()和fclose()函数 我知道如何实现这一点的唯一方法是将输出文件的权限设置为0666,或者将其归“nobody”(即在Apache web服务器上运行PHP的用户)所有 所以,如果“0666”或“无人拥有”是安全风险,您如何成功且安全地允许PHP脚本写入文件 感谢您分享有关此主题的指导。如果您需要在上传文件后从PHP访问这些文件,则需要使用允许web服务器(本例中为apache)访问这些

每当我想让PHP脚本将输出写入服务器上的文件时,我经常会遇到负面评论

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

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

所以,如果“0666”或“无人拥有”是安全风险,您如何成功且安全地允许PHP脚本写入文件


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

如果您需要在上传文件后从PHP访问这些文件,则需要使用允许web服务器(本例中为apache)访问这些文件的权限来存储这些文件。人们所说的风险是,你网站上的一些脚本可能被愚弄而提供文件。这是一种假设性风险,但许多内容管理系统都存在这种风险。为缓解这一风险:

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

  • 如果您只需要删除该文件,而不再提供它或通过PHP访问它,那么您还有更多的选择。使用
    chmod
    chown
    命令使apache用户无法读取。如果您想变得特别偏执,请使用cron脚本将文件移动(并重命名)到PHP源代码中未知的位置。至少,如果您的服务器遭到黑客攻击,入侵者无法直接进入目录,但我们正朝着讨论操作系统安全的方向发展。

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


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

    请解释您如何通过允许自己的脚本写入文件来“损害服务器安全”。向DB写入数据是否也存在安全风险?只要确保你的代码没有安全漏洞。只要事情做对了,就没有问题。@Flukey。。。这就是我问题的目的。我不清楚这个问题。但是,每当我提到服务器上有一个0666文件,或者PHP运行的用户拥有一个文件时,我都会收到类似这样的警告性评论:“当然,你知道你的服务器面临着安全风险。”。我只是想在不影响服务器安全的情况下编写有效的脚本。只要要写入的文件在公共Apache目录之外,我就看不出有问题。他们的评论是无知的。(@Flukey)啊哈……那么也许我们正接近问题的核心。他们的评论并不是无知的,因为该文件实际上位于公共Apache目录中。因此,换句话说,如果一个文件属于“无人”所有,但却位于公共Apache目录之外,那么就不存在安全问题——当然,前提是我的PHP脚本本身没有任何危害服务器安全的行为?恕我直言,系统管理员可能会认为这是一个愚蠢的问题,但我是一名开发人员,不是系统管理员(但我担心我的服务器的安全性)。谢谢@DuaneGran。我将通读你的答案,并在短期内更彻底地消化它。但我的第一反应是你所说的“散列名字”是什么意思?还有,你是如何做到这一点的,并且仍然在脚本中使用它?@Dr.DOT我错误地建议使用散列,因为这是一种方法。我的错。碰巧,这个最近的问题回答了有关文件名的easy crypt/decrypt函数: