麻烦修复文件上传漏洞和sql注入问题

少吃一顿

建议文件上传添加白名单校验,sql拼接采用SimpleEvaluationContext弃用StandardEvaluationContext 你们框架修复比较简单一些,否则你们系统很容易被攻破

回答6

少吃一顿
@超级管理员

文档上传如果没有白名单校验很容易就会出现恶意php或jsp类的脚本文件上传执行

SimpleEvaluationContext弃用StandardEvaluationContext 这个可以直接替换

白名单: 可以这样添加

首先添加 :

package com.jeelowcode.tool.framework.common.util.io;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.StrUtil;

import java.util.Collection;
import java.util.List;
import java.util.Locale;

import static com.jeelowcode.tool.framework.common.exception.enums.GlobalErrorCodeConstants.FILE_TYPE_NOT_ALLOWED;
import static com.jeelowcode.tool.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 上传文件安全校验工具类
 * <p>
 * 采用「后缀白名单」机制,由 jeelowcode.security.file-whitelist.enable 开关控制:

 *
 * @author mashu
 */
public class FileUploadSecurityUtils {

    private FileUploadSecurityUtils() {
    }

    /**
     * 校验文件后缀是否允许上传
     *
     * @param fileName        文件名或文件路径(可包含查询串,如 a.jpg?x=1)
     * @param enable          是否开启后缀白名单校验(开关)
     * @param allowExtensions 允许上传的后缀白名单,例如 jpg、png、pdf
     */
    public static void checkFileExtension(String fileName, boolean enable, List<String> allowExtensions) {
        // 未开启白名单校验,则直接放行
        if (!enable) {
            return;
        }
        // 文件名为空时无法校验,此处放行,交由后续逻辑兜底(例如用 path 填充 name)
        if (StrUtil.isBlank(fileName)) {
            return;
        }
        // 去掉查询串与锚点,仅保留文件主体
        String extName = FileNameUtil.extName(removeQueryString(fileName));
        // 无后缀文件无法确认安全性,直接拒绝
        if (StrUtil.isBlank(extName)) {
            throw exception(FILE_TYPE_NOT_ALLOWED);
        }
        if (!containsExtension(allowExtensions, extName)) {
            throw exception(FILE_TYPE_NOT_ALLOWED);
        }
    }

    /**
     * 去掉查询串(?)与锚点(#),仅保留文件主体
     */
    private static String removeQueryString(String fileName) {
        int cut = fileName.indexOf('?');
        int anchor = fileName.indexOf('#');
        if (anchor >= 0 && (cut < 0 || anchor < cut)) {
            cut = anchor;
        }
        return cut > 0 ? fileName.substring(0, cut) : fileName;
    }

    /**
     * 判断后缀是否在白名单内(忽略大小写,兼容配置为 .jpg 的写法)
     */
    private static boolean containsExtension(Collection<String> allowExtensions, String extName) {
        // 白名单为空时,视为全部拒绝
        if (CollUtil.isEmpty(allowExtensions)) {
            return false;
        }
        String ext = extName.toLowerCase(Locale.ROOT);
        return allowExtensions.stream()
                .filter(StrUtil::isNotBlank)
                .anyMatch(item -> StrUtil.equalsIgnoreCase(StrUtil.removePrefix(item.trim(), "."), ext));
    }

}


在上传文件的方法 添加 :


之后,添加 按钮和配置 :

在配置文件中,配置可上传的白名单


写回答

扫码关注

微信公众号二维码