5.1.5 文件操作漏洞防范
文件操作漏洞在部分原理及利用方式上面都有一定相似性,所以下面我们分为通用防御手段和针对性防御手段来介绍怎么防御文件操作漏洞。
5.1.5.1 通用文件操作防御
文件操作漏洞利用有几个共同点如下:
1)由越权操作引起可以操作未授权操作的文件。
2)要操作更多文件需要跳转目录。
3)大多都是直接在请求中传入文件名。
我们需要这几个共同点来思考防御手段:
·对权限的管理要合理,比如用户 A 上传的文件其他平行权限的用户在未授权的情况下不能进行查看和删除等操作,特殊的文件操作行为限定特定用户才有权限,比如后台删除文件的操作,肯定是需要限制管理员才能操作。
·有的文件操作是不需要直接传入文件名的,比如下载文件的时候,下载的文件是已知的,则我们可以用更安全的方法来替代直接以文件名为参数下载操作,在上传文件时,只要把文件名、文件路径、文件 ID(随机 MD5 形式)以及文件上传人存储在数据库中,下载的时候直接根据文件 ID 和当前用户名去判断当前用户有没有权限下载这个文件,如果有则读取路径指向的这个文件并返回下载即可。
·要避免目录跳转的问题,在满足业务需求的情况下,我们可以使用上面第二说的方法,但是有的情况下如后台进行文件编辑等操作时,需要传入文件路径的,可以在后台固定文件操作目录,然后禁止参数中有“..”两个点和反斜杠“/”以及斜杠“\”来跳转目录,怎么禁止呢?检查到传入的参数有这些字符,之间提示禁止操作并停止程序继续往下执行即可。
5.1.5.2 文件上传漏洞防范
文件上传漏洞相比下载、删除更复杂,所以这里单独拿出来讲一下怎么防范,文件上传漏洞虽然定位起来比较简单,但是修复起来要考虑的东西还是不少,主要是不同环境下的利用场景比较多,需要比较完善的策略去防止漏洞出现。修复和防止一种漏洞之前,要比较全的清楚这种漏洞在不同环境下的利用方式,这样才能防御的比较全,文件上传漏洞主要有两种利用方式,分为上传的文件类型验证不严谨和写入文件不规范。针对这两种利用方式,我给出的防范方案如下:
1)白名单方式过滤文件扩展名,使用 in_array 或者三等于(===)来对比扩展名。
2)保存上传的文件时重命名文件,文件名命名规则采用时间戳的拼接随机数的 MD5 值方式"md5(time()+rand(1,10000))"。
我们对之前的代码稍微改动下,给出示例代码如下:
<?php function getExt ( $filename ) { return substr ( $filename , strripos ( $filename , '.' ) +1 ); } $disallowed_types = array ( 'jpg' , 'png' , 'gif' ); // 获取文件扩展名 $FilenameExt = strtolower ( getExt ( $_FILES["file"]["name"] )); # 判断是否在被允许的扩展名里 if (! in_array ( $FilenameExt , $disallowed_types )) { die ( "disallowed type" ); } else { $filename = md5 ( time () +rand ( 1 , 10000 )) .".".$FilenameExt ; // 移动文件 move_uploaded_file ( $_FILES["file"]["tmp_name"] , "upload/" . $FileName ); }?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论