从其用户保护PHP文件管理器

lim*_*ima 1 php security ajax codeigniter file

大家好,我正在使用CodeIgniter PHP框架开发照片共享网站.这个想法是人们可以上传他们的照片,管理他们(通过某种文件浏览器,允许他们创建子文件夹,拖动文件等)和编辑它们(一些基本的东西,如调整大小,旋转和裁剪开始,和稍后,我将添加一些高级功能).

我已经为CI(Redux Authentication 2 Beta)实现了第三方认证解决方案,我现在正在集成一个JS/PHP文件管理器(AjaxExplorer),但问题是用于管理文件的PHP后端(移动,复制,等)过多地信任来自ajax调用的用户输入.例如,它正在做这样的事情(为了清楚起见,简化了):

move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,存在明显的安全问题,因为它盲目地接受用户投入的任何路径!我已经可以看到有人发送类似"../AnotherUser/"的内容作为$ _POST ['destination_dir']值.

我的问题是:什么是"沙盒"用户的最佳方式,以便只允许他管理自己的数据?我只是验证+过滤输入,希望捕获每次入侵的尝试?是否有专门用于解决此特定问题的库/包?

我认为这个问题必须在任何(足够成熟的)项目中以某种方式解决,这使得用户能够通过Web浏览器管理他们的文件,所以我希望找到一些明确的指导方针(因为有很多关于SQL注入的内容) ,XSS,CSRF等)但我想我没有使用正确的关键字.

bob*_*nce 6

什么是"沙盒"用户的最佳方式,以便只允许他管理自己的数据?

允许用户想要的任何文件名/目录名,但不要在服务器端文件系统上使用它们.相反,使用主键将路径名写入数据库,并将主键用作平面存储目录中的"34256.dat"等文件名(如果您愿意,甚至可以使用数据库中的BLOB).然后通过下载脚本或URL重写进行提供,以使所需的文件名出现在URL中.

清理传入的文件名很难.检测'..'只是一个开始.太长的文件名; 太短的文件名; 前导点和尾随点的组合; 前导和尾随空格的组合; 不同平台的不同目录分隔符; 在某些平台上无效的字符; 控制字符; Unicode字符和特定于环境的解决方法; 美国存托股份; 文件名('.htaccess')或扩展名('.php','..cgi')可能对您的Web服务器"特殊"; Windows的保留文件名......

您可以花一生时间在各种平台上跟踪文件路径规则的有趣小问题,或者您可以忘记它并使用数据库.