热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中的文件系统安全

PHP受大多数服务器系统安全机制的控制,这些安全机制通常是基于文件和目录许可基础的。这使得您可以控制文件系统中的哪些文件可以被读取
PHP 受大多数服务器系统安全机制的控制,这些安全机制通常是基于文件和目录许可基础的。这使得您可以控制文件系统中的哪些文件可以被读取。您需要特别注意所有全局可读的文件,要保证所有访问该文件系统的用户对它们的读取是安全的。 

由于 PHP 在设计的时候,允许用户级访问文件系统,因此编写一个 PHP 脚本使得您能够读取诸如 /etc/passwd,更改您的以太网连接,发送繁重的打印机任务等是完全有可能的。这里有一些明显的关联,您需要保证您读取和写入的是正确的文件。 

在以下脚本中,一个用户希望该脚本能够删除它们主目录中的一个文件。这仅仅是假设了一种 PHP WEB 接口通常被用作文件管理的情况,因此 Apache 用户被允许删除用户主目录的文件。 

例子 15-1. 薄弱的变量检验将导致……

// remove a file from the user's home directory
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");
echo "$file_to_delete has been deleted!";
?>  
 
由于用户名是可以从用户表单发送的,因此他们可以提交一个用户名和属于其他人的文件,使得这些文件被删除。在该情况下,您会需要使用另外的表单来授权。考虑一下如果被提交的变量是“../etc/”和“passwd”将会发生什么?这个时候其代码可以被理解为: 例子 15-2. 一个文件系统攻击

// removes a file from anywhere on the hard drive that
// the PHP user has access to. If PHP has root access:
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd has been deleted!";
?>  
 
有两种您必须采取的措施来避免这些问题。 


对 PHP WEB 用户仅赋予有限的权限。 

检验所有提交的变量。 

以下是经过改进的脚本: 例子 15-3. 更加安全的文件名检验

// removes a file from the hard drive that
// the PHP user has access to.
$username = $_SERVER['REMOTE_USER']; // using an authentication mechanisim

$homedir = "/home/$username";

$file_to_delete = basename("$userfile"); // strip paths
unlink ($homedir/$file_to_delete);

$fp = fopen("/home/logging/filedelete.log","+a"); //log the deletion
$logstring = "$username $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);

echo "$file_to_delete has been deleted!";
?>  
 
尽管如此,该脚本还是有一些问题。如果您的授权系统允许用户建立他们自己的用户登录,而某用户选择登录“../etc/”,系统将被再次暴露。基于这一点,您可能更愿意编写一个更好的检验: 例子 15-4. 更安全的文件名检验

$username = $_SERVER['REMOTE_USER']; // using an authentication mechanisim
$homedir = "/home/$username";

if (!ereg('^[^./][^/]*$', $userfile))
     die('bad filename'); //die, do not process

if (!ereg('^[^./][^/]*$', $username))
     die('bad username'); //die, do not process
//etc...
?>  
 
根据您的操作系统的不同,您需要考虑许多各种各样的文件,包括设备项目(/dev/ 或 COM1),设置文件(/etc/ 文件和 .ini 文件),通常的文件存储区(/home/,My Documents)等。基于这一点,建立一个策略禁止所有除了您明确的授权的行为可能要更简单一些

推荐阅读
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 了解多域名SAN SSL证书及其工作原理
    本文介绍了多域名SAN SSL证书的概念及其工作方式,探讨其在现代网络安全中的重要性和应用。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
author-avatar
时间证明一2602891163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有