1

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

我已经为 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 等),但我想我没有使用正确的关键字。

4

3 回答 3

6

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

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

清理传入的文件名很难。检测“..”只是开始。文件名过长;文件名太短;前导点和尾随点的组合;前导和尾随空格的组合;不同平台的不同目录分隔符;在某些平台上无效的字符;控制字符;Unicode 字符和特定环境的寻址方式;ADS;对您的网络服务器来说可能是“特殊”的文件名('.htaccess')或扩展名('.php'、'.cgi');Windows 的保留文件名...

您可以花费一生的时间来追踪各种平台上有趣的文件路径规则的小怪癖,或者您可以忘记它并使用数据库。

于 2009-03-03T21:08:53.347 回答
0

我不确定你的destination_dir样子,但我想到的是分配目录键,然后根据该键获取目录。例如:

//$_POST['destination_dir'] = '4hg43h5g453j45b3';
*_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

但是,您必须事先预定义键。另一种选择可能相反:md5/sha1 输入并将其用作destination_dir,然后将该键与相关标签一起存储在数据库中。

于 2009-03-03T20:56:11.707 回答
0

我所知道的没有图书馆。
但是,在您的特定示例中,从字符串中删除所有(反)斜杠和点,然后在其末尾附加一个斜杠,这样用户就无法更改文件夹。

$destdir = str_replace(array('.', '/', '\\'), '', $_POST['destination_dir']); 
$destdir .= "/";
于 2009-03-03T20:58:45.087 回答