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

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

move_uploaded_file(

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

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

<*>

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

我的问题是:“沙盒”的最佳方法是什么?一个用户,为了只允许他管理自己的数据?我只是验证+过滤输入,希望捕获每一次入侵企图?是否有专门用于解决此特定问题的库/包?

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

FILES['upload']['tmp_name'], $root.$username.

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

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

<*>

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

我的问题是:“沙盒”的最佳方法是什么?一个用户,为了只允许他管理自己的数据?我只是验证+过滤输入,希望捕获每一次入侵企图?是否有专门用于解决此特定问题的库/包?

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

POST['destination_dir']);

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

我的问题是:“沙盒”的最佳方法是什么?一个用户,为了只允许他管理自己的数据?我只是验证+过滤输入,希望捕获每一次入侵企图?是否有专门用于解决此特定问题的库/包?

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

有帮助吗?

解决方案

  

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

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

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

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

其他提示

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

//

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

<*>

但是你必须事先预定义键。另一种选择可能相反:md5 / sha1输入并使用它作为destination_dir,然后将该密钥存储在数据库中并附带相关标签。

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

但是你必须事先预定义键。另一种选择可能相反:md5 / sha1输入并使用它作为destination_dir,然后将该密钥存储在数据库中并附带相关标签。

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

$destdir = str_replace(array('.', '/', '\\'), '', 

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

<*>POST['destination_dir']); $destdir .= "/";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top