Defensa contra ataques xss

Como desarrolladores de servidores, no podemos confiar en nada de lo que ingrese el usuario. Por ejemplo: la cantidad no se puede pasar desde el front-end, el uso de tokens que dejarán de ser válidos, etc. Por supuesto, además de pasar algunos datos falsos, los usuarios también pasarán algunos scripts falsos. El más famoso es el ataque xss.

Hay muchas formas de resolver ataques xss en Internet, y muchas de ellas están relacionadas con el front-end, de hecho, la última defensa en el back-end es la más importante.

En este proyecto, se usa un filtro 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);
    }
}

Principalmente a través de new XssWrapper(req)una serie de filtrado del objeto, XssWrappermediante Jsoupserie de filtrado de la entrada del usuario. Después de todo, los asuntos profesionales deben ser manejados por personas profesionales. En este punto, hemos completado la defensa contra ataques xss a través de configuraciones 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);
    }
}

Existe el método más importante XssUtil.clean(value)-> Jsoup.clean(content, "", WHITE_LIST, OUTPUT_SETTINGS)Siempre es mejor tener una lista blanca de esta superficie WHITE_LIST, observamos cuidadosamente la lista blanca y descubriremos que hay una parte de la etiqueta en el html que lleva para evitar ataques 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")

Supongo que te gusta

Origin blog.csdn.net/lmsfv/article/details/106058188
Recomendado
Clasificación