سؤال

ما الذي يجب أن أفعله لمنع XSS في الربيع MVC؟ الآن أنا فقط أضع جميع الأماكن التي أخرج فيها نص المستخدم في JSTL <c:out> العلامات أو fn:escapeXml() وظائف ، ولكن هذا يبدو عرضة للخطأ حيث قد أفتقد مكان ما.

هل هناك طريقة منهجية سهلة لمنع هذا؟ ربما مثل مرشح أو شيء من هذا القبيل؟ أقوم بجمع المدخلات عن طريق تحديد @RequestParam المعلمات على أساليب وحدة التحكم الخاصة بي.

هل كانت مفيدة؟

المحلول

في الربيع ، يمكنك الهروب من HTML من صفحات JSP التي تم إنشاؤها بواسطة <form> العلامات. هذا يغلق الكثير من السبل لهجمات XSS ، ويمكن القيام به تلقائيًا بثلاث طرق:

للتطبيق بأكمله في web.xml ملف:

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

لجميع النماذج في صفحة معينة في الملف نفسه:

<spring:htmlEscape defaultHtmlEscape="true" /> 

لكل نموذج:

<form:input path="someFormField" htmlEscape="true" /> 

نصائح أخرى

محاولة xssfilter.

أستخدم مصادقة السبات عبر @Valid لجميع كائنات الإدخال (الربط و @RequestBody جيسون ، انظر https://dzone.com/articles/spring-31-valid-requestbody). لذا @org.hibernate.validator.constraints.SafeHtml هو حل جيد بالنسبة لي.

بيات شتوى SafeHtmlValidator يعتمد على org.jsoup, ، لذلك هناك حاجة لإضافة تبعيات أخرى للمشروع:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.1</version>
</dependency>

للفول User مع الحقل

@NotEmpty
@SafeHtml
protected String name;

لمحاولة التحديث مع القيمة <script>alert(123)</script> في وحدة التحكم

@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id) 

أو

@PostMapping
public void createOrUpdate(@Valid User user) {

هذا خطئ BindException لربط و MethodArgumentNotValidException ل @RequestBody مع الرسالة الافتراضية:

name may have unsafe html content

يعمل المدقق أيضًا على الربط ، كما كان من قبل. يمكن اختبار التطبيقات في http://topjava.herokuapp.com/

عندما تحاول منع XSS ، من المهم التفكير في السياق. كمثال على كيفية وماذا تفلت من الهروب يختلف تمامًا إذا كنت تقوم بتصوير بيانات داخل متغير في مقتطف JavaScript بدلاً من إخراج البيانات في علامة HTML أو سمة HTML.

لدي مثال على هذا هنا: http://erlend.oftedal.no/blog/؟blogid=91

أيضا الخروج عن ورقة الغش في الوقاية من OWASP: http://www.owasp.org/index.php/xss_٪28cross_site_scripting٪29_prevention_cheat_sheet

لذا فإن الإجابة المختصرة هي ، تأكد من الهروب من الإخراج كما اقترحه Tendayi Mawushe ، ولكن احرص على العناية الخاصة عند إخراج البيانات في سمات HTML أو JavaScript.

كيف تقوم بجمع مدخلات المستخدم في المقام الأول؟ قد يساعد هذا السؤال / الإجابة إذا كنت تستخدم FormController:

الربيع: الهروب من الإدخال عند الربط للأمر

تحقق دائمًا من الأساليب والعلامات التي تستخدمها يدويًا ، وتأكد من أنها تفلت دائمًا من (مرة واحدة) في النهاية. الأطر لديها العديد من الأخطاء والاختلافات في هذا الجانب.

لمحة عامة: http://www.gablog.eu/online/node/91

بدلا من الاعتماد فقط <c:out />, ، يجب أيضًا استخدام مكتبة AntixSS ، والتي لن تشفر فقط ولكن أيضًا تعقيم النص الخبيث في الإدخال. واحدة من أفضل المكتبة المتاحة هي OWASP معاداة, ، إنه مرن للغاية ويمكن تكوينه (باستخدام ملفات سياسة XML) وفقًا للمتطلبات.

على سبيل المثال ، إذا كان التطبيق يدعم إدخال النص فقط ، فأكثر ملف السياسة يمكن استخدام OWASP الذي يعيق ويزيل معظم علامات HTML. وبالمثل ، إذا دعم تطبيق محرري HTML (مثل Tinymce) التي تحتاج إلى جميع أنواع علامات HTML ، يمكن استخدام سياسة أكثر مرونة مثل ملف سياسة eBay

**To avoid XSS security threat in spring application**

يتمثل الحل لمشكلة XSS في تصفية جميع حقول النص في النموذج في وقت إرسال النموذج.

    It needs XML entry in the web.xml file & two simple classes.

        java code :-
        The code for the  first class named CrossScriptingFilter.java is :

        package com.filter;

        import java.io.IOException;
        import javax.servlet.Filter;
        import javax.servlet.FilterChain;
        import javax.servlet.FilterConfig;
        import javax.servlet.ServletException;
        import javax.servlet.ServletRequest;
        import javax.servlet.ServletResponse;
        import javax.servlet.http.HttpServletRequest;
        import org.apache.log4j.Logger;

        public class CrossScriptingFilter implements Filter {
            private static Logger logger = Logger.getLogger(CrossScriptingFilter.class);
            private FilterConfig filterConfig;

            public void init(FilterConfig filterConfig) throws ServletException {
                this.filterConfig = filterConfig;
            }

            public void destroy() {
                this.filterConfig = null;
            }

            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
                logger.info("Inlter CrossScriptingFilter  ...............");
                chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
                logger.info("Outlter CrossScriptingFilter ...............");
            }

        }

الفئة الثانية المسمى requestWrapper.java هي:

حزمة com.filter ؛

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.log4j.Logger;

public final class RequestWrapper extends HttpServletRequestWrapper {
    private static Logger logger = Logger.getLogger(RequestWrapper.class);
    public RequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }

    public String[] getParameterValues(String parameter) {
        logger.info("InarameterValues .. parameter .......");
        String[] values = super.getParameterValues(parameter);
        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;
    }

    public String getParameter(String parameter) {
        logger.info("Inarameter .. parameter .......");
        String value = super.getParameter(parameter);
        if (value == null) {
            return null;
        }
        logger.info("Inarameter RequestWrapper ........ value .......");
        return cleanXSS(value);
    }

    public String getHeader(String name) {
        logger.info("Ineader .. parameter .......");
        String value = super.getHeader(name);
        if (value == null)
            return null;
        logger.info("Ineader RequestWrapper ........... value ....");
        return cleanXSS(value);
    }

    private String cleanXSS(String value) {
        // You'll need to remove the spaces from the html entities below
        logger.info("InnXSS RequestWrapper ..............." + value);
        //value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        //value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
        //value = value.replaceAll("'", "& #39;");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");

        value = value.replaceAll("(?i)<script.*?>.*?<script.*?>", "");
        value = value.replaceAll("(?i)<script.*?>.*?</script.*?>", "");
        value = value.replaceAll("(?i)<.*?javascript:.*?>.*?</.*?>", "");
        value = value.replaceAll("(?i)<.*?\\s+on.*?>.*?</.*?>", "");
        //value = value.replaceAll("<script>", "");
        //value = value.replaceAll("</script>", "");
        logger.info("OutnXSS RequestWrapper ........ value ......." + value);
        return value;
    }

الشيء الوحيد المتبقي هو إدخال XML في ملف web.xml:

        <filter>
        <filter-name>XSS</filter-name>
        <display-name>XSS</display-name>
        <description></description>
        <filter-class>com.filter.CrossScriptingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>XSS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

يشير /* إلى أنه لكل طلب مصنوع من المتصفح ، سيتصل بالفئة CrossScriptingFilter. التي ستحل محل جميع المكونات/العناصر من الطلب وسوف تحل محل جميع علامات JavaScript التي وضعها Hacker بسلسلة فارغة أي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top