如何在CodeIgniter中阻止或禁用特定文件类型?
解决CodeIgniter控制器中“允许绝大多数文件类型,仅排除指定危险类型”的问题
我懂你想实现的需求——放开绝大多数文件的上传权限,只拦截你列出的这些高风险文件类型,你的思路方向是对的,先把危险扩展名放进黑名单,再做校验。这里给你完善并优化一下这个方法,让它更适配CodeIgniter的开发逻辑:
function checkFileType($ext) { // 定义需要拦截的危险文件扩展名黑名单 $forbidden_extensions = array( 'ade','adp','bat','chm','cmd','com','cpl','dll','dmg','exe', 'hta','ins','isp','jar','js','jse','lib','lnk','mde','msc', 'msi','msp','mst','nsh','pif','scr','sct','shb','sys','vb', 'vbe','vbs','vxd','wsc','wsf','wsh' ); // 统一转小写,避免大小写差异导致校验失效 $ext = strtolower($ext); // 如果扩展名在黑名单里,返回false表示禁止上传 if(in_array($ext, $forbidden_extensions)) { return false; } // 不在黑名单里则返回true,允许上传 else { return true; } }
实用补充说明:
- 大小写兼容处理:我特意加了
strtolower(),实际开发里经常会遇到用户上传.EXE、.JS这类大写扩展名的文件,转小写后能确保黑名单校验不遗漏。 - 配合CodeIgniter上传类使用:如果是和CI自带的上传类搭配,你可以先把上传类的
allowed_types设为'*'(放开所有类型),再在上传前用这个方法做二次拦截:$this->load->library('upload'); $config['allowed_types'] = '*'; // 其他上传配置(路径、大小限制等)... $this->upload->initialize($config); // 获取上传文件的扩展名 $file_ext = pathinfo($_FILES['your_upload_field']['name'], PATHINFO_EXTENSION); if(!$this->checkFileType($file_ext)) { $this->session->set_flashdata('upload_error', '该文件类型属于危险类型,禁止上传'); redirect('your_upload_page'); } // 校验通过,执行上传操作 if($this->upload->do_upload('your_upload_field')) { // 上传成功后的逻辑(比如保存文件信息到数据库) } - 自定义返回信息:如果你想让方法返回更友好的提示,也可以把返回
false改成返回具体的错误字符串,比如return '禁止上传此类可执行/危险文件';,方便直接给用户展示提示。
这种黑名单校验方式刚好匹配你的需求——不用费劲枚举所有允许的文件类型,只需要把明确危险的类型排除在外,比白名单更灵活,但要记得定期更新黑名单,覆盖新出现的危险文件格式。
内容的提问来源于stack exchange,提问作者Highdef
相关产品推荐
相关产品推荐

