Défense contre les attaques XSS

En tant que développeurs de serveurs, nous ne pouvons faire confiance à rien de ce que l'utilisateur entre. Par exemple: le montant ne peut pas être passé depuis le front-end, l'utilisation de jetons qui deviendront invalides, etc. Bien sûr, en plus de transmettre de fausses données, les utilisateurs transmettront également de faux scripts, le plus connu étant l' attaque xss.

Il existe de nombreuses façons de résoudre les attaques xss sur Internet, et beaucoup d'entre elles sont liées au front-end. En fait, la dernière défense du back-end est la plus importante.

Dans ce projet, un filtre est utilisé XssFilter

public class XssFilter implements Filter {
    Logger logger = LoggerFactory.getLogger(getClass().getName());

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        
        logger.info("uri:{}",req.getRequestURI());
        // xss 过滤
        chain.doFilter(new XssWrapper(req), resp);
    }
}

Principalement par new XssWrapper(req)une série de filtrage de l'objet, XssWrapperpar une série de filtrage des Jsoupentrées de l'utilisateur. Après tout, les questions professionnelles doivent être gérées par des professionnels. À ce stade, nous avons terminé la défense contre les attaques xss grâce à des paramètres simples .

public class XssWrapper extends HttpServletRequestWrapper {
    
    
    /**
     * Constructs a request object wrapping the given request.
     *
     * @param request The request to wrap
     * @throws IllegalArgumentException if the request is null
     */
    public XssWrapper(HttpServletRequest request) {
    
    
        super(request);
    }

    /**
     * 对数组参数进行特殊字符过滤
     */
    @Override
    public String[] getParameterValues(String name) {
    
    
        String[] values = super.getParameterValues(name);
        if (values == null) {
    
    
            return null;
        }
        int count = values.length;
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
    
    
            encodedValues[i] = cleanXSS(values[i]);
        }
        return encodedValues;
    }

    /**
     * 对参数中特殊字符进行过滤
     */
    @Override
    public String getParameter(String name) {
    
    
        String value = super.getParameter(name);
        if (StrUtil.isBlank(value)) {
    
    
            return value;
        }
        return cleanXSS(value);
    }

    /**
     * 获取attribute,特殊字符过滤
     */
    @Override
    public Object getAttribute(String name) {
    
    
        Object value = super.getAttribute(name);
        if (value instanceof String && StrUtil.isNotBlank((String) value)) {
    
    
            return cleanXSS((String) value);
        }
        return value;
    }

    /**
     * 对请求头部进行特殊字符过滤
     */
    @Override
    public String getHeader(String name) {
    
    
        String value = super.getHeader(name);
        if (StrUtil.isBlank(value)) {
    
    
            return value;
        }
        return cleanXSS(value);
    }

    private String cleanXSS(String value) {
    
    
        return XssUtil.clean(value);
    }
}

Il y a la méthode la plus importante XssUtil.clean(value)-> Jsoup.clean(content, "", WHITE_LIST, OUTPUT_SETTINGS)Cette surface est toujours préférable d'avoir une liste blanche WHITE_LIST, nous observons attentivement la liste blanche trouvera qu'il y a une partie de la partie de la balise dans le html transportant pour empêcher les attaques xss

new Whitelist().addTags(
                        "a", "b", "blockquote", "br", "caption", "cite", "code", "col",
                        "colgroup", "dd", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6",
                        "i", "img", "li", "ol", "p", "pre", "q", "small", "span", "strike", "strong",
                        "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u",
                        "ul")
    
                .addAttributes("a", "href", "title")
                .addAttributes("blockquote", "cite")
                .addAttributes("col", "span", "width")
                .addAttributes("colgroup", "span", "width")
                .addAttributes("img", "align", "alt", "height", "src", "title", "width")
                .addAttributes("ol", "start", "type")
                .addAttributes("q", "cite")
                .addAttributes("table", "summary", "width")
                .addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width")
                .addAttributes(
                        "th", "abbr", "axis", "colspan", "rowspan", "scope",
                        "width")
                .addAttributes("ul", "type")

                .addProtocols("a", "href", "ftp", "http", "https", "mailto")
                .addProtocols("blockquote", "cite", "http", "https")
                .addProtocols("cite", "cite", "http", "https")
                .addProtocols("img", "src", "http", "https")
                .addProtocols("q", "cite", "http", "https")

Je suppose que tu aimes

Origine blog.csdn.net/lmsfv/article/details/106058188
conseillé
Classement