欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

用PHP实现一个高效安全的ftp服务器(二),php实现ftp服务器

程序员文章站 2024-02-05 22:34:12
...

用PHP实现一个高效安全的ftp服务器(二),php实现ftp服务器

接前文。

 1.实现用户类CUser。

  用户的存储采用文本形式,将用户数组进行json编码。  

用户文件格式:
 * array(
 *         'user1' => array(
 *             'pass'=>'',
 *             'group'=>'',
 *             'home'=>'/home/ftp/', //ftp主目录
 *             'active'=>true,
 *             'expired=>'2015-12-12',
 *             'description'=>'',
 *             'email' => '',
 *             'folder'=>array(
 *                     //可以列出主目录下的文件和目录,但不能创建和删除,也不能进入主目录下的目录
 *                     //前1-5位是文件权限,6-9是文件夹权限,10是否继承(inherit)
 *                     array('path'=>'/home/ftp/','access'=>'RWANDLCNDI'),
 *                     //可以列出/home/ftp/a/下的文件和目录,可以创建和删除,可以进入/home/ftp/a/下的子目录,可以创建和删除。
 *                     array('path'=>'/home/ftp/a/','access'=>'RWAND-----'),
 *             ),
 *             'ip'=>array(
 *                 'allow'=>array(ip1,ip2,...),//支持*通配符: 192.168.0.*
 *                 'deny'=>array(ip1,ip2,...)
 *             )
 *         ) 
 * )
 * 
 * 组文件格式:
 * array(
 *         'group1'=>array(
 *             'home'=>'/home/ftp/dept1/',
 *             'folder'=>array(
 * 
 *             ),
 *             'ip'=>array(
 *                 'allow'=>array(ip1,ip2,...),
 *                 'deny'=>array(ip1,ip2,...)
 *            )
 *         )
 * )

  文件夹和文件的权限说明:

 * 文件权限 
 * R读 : 允许用户读取(即下载)文件。该权限不允许用户列出目录内容,执行该操作需要列表权限。 
 * W写: 允许用户写入(即上传)文件。该权限不允许用户修改现有的文件,执行该操作需要追加权限。
 * A追加: 允许用户向现有文件中追加数据。该权限通常用于使用户能够对部分上传的文件进行续传。 
 * N重命名: 允许用户重命名现有的文件。
 * D删除: 允许用户删除文件。 
 * 
 * 目录权限 
 * L列表: 允许用户列出目录中包含的文件。
 * C创建: 允许用户在目录中新建子目录。 
 * N重命名: 允许用户在目录中重命名现有子目录。
 * D删除: 允许用户在目录中删除现有子目录。注意: 如果目录包含文件,用户要删除目录还需要具有删除文件权限。
 * 
 * 子目录权限
 * I继承: 允许所有子目录继承其父目录具有的相同权限。继承权限适用于大多数情况,但是如果访问必须受限于子文件夹,例如实施强制访问控制(Mandatory Access Control)时,则取消继承并为文件夹逐一授予权限。
 * 

  实现代码如下:  

  

class User{ const I = 1; // inherit const FD = 2; // folder delete const FN = 4; // folder rename const FC = 8; // folder create const FL = 16; // folder list const D = 32; // file delete const N = 64; // file rename const A = 128; // file append const W = 256; // file write (upload) const R = 512; // file read (download) private $hash_salt = ''; private $user_file; private $group_file; private $users = array(); private $groups = array(); private $file_hash = ''; public function __construct(){ $this->user_file = BASE_PATH.'/conf/users'; $this->group_file = BASE_PATH.'/conf/groups'; $this->reload(); } /** * 返回权限表达式 * @param int $access * @return string */ public static function AC($access){ $str = ''; $char = array('R','W','A','N','D','L','C','N','D','I'); for($i = 0; $i $i
相关标签: 连接数据库