大家好,我正在使用CodeIgniter PHP framework开发照片共享网站。这个想法是人们可以上传他们的照片,管理他们(通过某种文件浏览器,允许他们创建子文件夹,拖动文件等)和编辑它们(一些基本的东西,如调整大小,旋转和裁剪开始,和稍后,我将添加一些高级功能。)
我已经为CI(Redux Authentication 2 Beta)实现了第三方身份验证解决方案,我现在正在集成JS / PHP文件管理器(AjaxExplorer),但问题是PHP后端管理文件(移动,复制等)过于信任来自ajax调用的用户输入。例如,它正在做这样的事情(为了清楚起见而简化):
move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);
正如您所看到的,存在明显的安全问题,因为它盲目地接受用户投入的任何路径!我已经可以看到有人发送类似“../AnotherUser/”的内容作为$ _POST ['destination_dir']值。
我的问题是:用户“沙盒”的最佳方式是什么,只允许他管理自己的数据?我只是验证+过滤输入,希望能抓住每一个入侵的企图?是否有专门用于解决此特定问题的库/包?
我认为这个问题必须在任何(足够成熟的)项目中以某种方式解决,这使得用户能够通过网络浏览器管理他们的文件,因此我希望找到一些明确的指导方针(因为有很多)关于SQL注入,XSS,CSRF等)但我想我没有使用正确的关键字。
答案 0 :(得分:6)
“沙盒”用户的最佳方法是什么,以便只允许他管理自己的数据?
允许用户想要的任何文件名/目录名,但不要在服务器端文件系统上使用它们。相反,使用主键将路径名写入数据库,并将主键用作平面存储目录中的“34256.dat”等文件名(如果您愿意,甚至可以使用数据库中的BLOB)。然后通过下载脚本或URL重写进行处理,以使所需的文件名出现在URL中。
清理传入的文件名是难的。检测'..'只是一个开始。太长的文件名;太短的文件名;前导点和尾随点的组合;前导和尾随空格的组合;不同平台的不同目录分隔符;在某些平台上无效的字符;控制字符; Unicode字符和特定于环境的解决方法;美国存托股份;文件名('.htaccess')或扩展名('。php','。。cgi')可能对您的网络服务器“特殊”; Windows的保留文件名......
您可以花一生时间在各种平台上追踪文件路径规则的有趣小问题,或者您可以忘记它并使用数据库。
答案 1 :(得分:0)
我不确定你的destination_dir
是什么样的,但我想到的是分配目录密钥,然后根据该密钥获取目录。例如:
//$_POST['destination_dir'] = '4hg43h5g453j45b3';
*_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.
但是你必须事先预定义键。另一种选择可能相反:md5 / sha1输入并使用它作为destination_dir,然后将该密钥存储在数据库中并附带相关标签。
答案 2 :(得分:0)
我所知道的没有图书馆 但是在您的特定示例中,从字符串中删除所有(后退)斜杠和点,然后在其末尾附加斜杠,这样用户就无法更改文件夹。
$destdir = str_replace(array('.', '/', '\\'), '', $_POST['destination_dir']);
$destdir .= "/";