You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
    }
}

实用补充说明:

  1. 大小写兼容处理:我特意加了strtolower(),实际开发里经常会遇到用户上传.EXE、.JS这类大写扩展名的文件,转小写后能确保黑名单校验不遗漏。
  2. 配合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')) {
        // 上传成功后的逻辑(比如保存文件信息到数据库)
    }
    
  3. 自定义返回信息:如果你想让方法返回更友好的提示,也可以把返回false改成返回具体的错误字符串,比如return '禁止上传此类可执行/危险文件';,方便直接给用户展示提示。

这种黑名单校验方式刚好匹配你的需求——不用费劲枚举所有允许的文件类型,只需要把明确危险的类型排除在外,比白名单更灵活,但要记得定期更新黑名单,覆盖新出现的危险文件格式。

内容的提问来源于stack exchange,提问作者Highdef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:20