2010-01-27 18 views
45

XSS'i Spring MVC'de önlemek için ne yapmalıyım? Şu anda kullanıcı metinlerini JSTL <c:out> etiketlerine veya fn:escapeXml() işlevlerine yerleştirdiğim tüm yerleri yerleştiriyorum, ancak bir yeri özleyebildiğim için bu hataya eğilimli görünüyor.İnsanların Spring MVC'de XSS yapmasını nasıl önleyebilirim?

Bunu önlemek için kolay sistematik bir yol var mı? Belki bir filtre gibi mi? Denetleyici yöntemlerimde @RequestParam parametrelerini belirterek girdileri topluyorum.

+2

Bkz Joel Spolsky en * Yapımı Kanunu yani boş dize ile hacker tarafından koymak tüm javascript etiketleri yerini alacak istek & geldi. com/articles/Wrong.html - bu kesin sorunla nasıl başa çıkılacağı ile ilgilidir. – mob

+0

Başlık, "ilk olarak, kişinin beynine bir JVM takın" şeklinde komik bir şekilde yanlış okunabilir ve yanıtlanabilir. ;) – Svante

+0

Çok benzer bir soru burada bulunabilir: http://stackoverflow.com/questions/2658922/xss-prevention-in-java –

cevap

50

: Bir FormController kullanıyorsanız bu soru/cevap yardımcı olabilir. Bu XSS saldırıları için çok yollar kapalı kapatır ve üç şekilde otomatik olarak yapılabilir: dosyanın kendisinde belirli bir sayfadaki tüm formları için

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

: web.xml dosyada tüm uygulama için

:

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

Tüm sayfalarıma eklediğim içerme dosyasına koydum, ancak bir fark yaratmıyor gibi görünüyor. Bu etiket $ {param.q} 'nin kaçmasına neden olur mu? – Doug

+2

Bir HTML özniteliğinde veya bir Javascript içinde sonuç dizelerini kullanırsanız, 'defaultHTMLEscape 'yeterli olmaz, ardından ' etiketini kullanın. VarsayılanHtmlEscape, tüm html karakterlerinden kaçmıyor gibi görünüyor. Bu, örn. '<' '>' veya '&' ama çift tırnak işaretleri benim için kaçmadı '' Bu durum ortaya çıkan dizgenin örneğin bir html özniteliğinde veya bir javascriptte kullanılması durumunda sorunlara yol açabilir (ayrıca bkz. Erlend'in yanıtı) – Andreas

+3

İçerik-parammı web.xml dosyasına ekledim ama işe yaramıyor – Jack

8

XSSFilter'u deneyin.

+0

Sayfa mevcut değil. – opyate

+0

@opyate - hareket ettikleri görünüyor. Güncelledim – Bozho

+0

Teşekkürler. İzleyen eğik çizgiyi kaldırdım, aksi halde 404. (eş yorum beklenir) – opyate

0

zaman elkitabıdır kontrol: her form için

<spring:htmlEscape defaultHtmlEscape="true" /> 

Kullandığınız yöntemleri, etiketleri ve her zaman sonunda (bir kez) kaçtıklarından emin olun. Çerçevelerin bu açıdan birçok hata ve farklılık var.

bir bakış: http://www.gablog.eu/online/node/91

6

Eğer XSS önlemek için çalışıyoruz, bu bağlamda düşünmek önemlidir. Örnek olarak, bir HTML etiketinde veya bir HTML özniteliğindeki verilerin çıktısının tersine bir javascript snippet'inin içindeki bir değişken içinde veri akıtıyorsanız nasıl ve neyin kaçacağı çok farklıdır. Yani kısa cevap, sen Tendayi Mawushe önerdiği gibi çıktı kaçış, ama almak emin olun edilir http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

: http://erlend.oftedal.no/blog/?blogid=91

Ayrıca OWASP XSS Önleme Hile Sheet ödeme:

Burada bu bir örnek var HTML nitelikleri veya javascript'te veri çıkışı yaparken özel dikkat.

+0

"özel dikkat göster" = HTML nitelikleri veya javascript'te veri çıkışı yaptığınızda '' etiketini kullanın (Benim görüşüm Tendayi Mawushe'nin cevabına bakın) – Andreas

+1

Eh, sadece 'u kullanmaktan daha fazlası .. Javascript'in HTML'den başka kontrol karakterleri vardır ve farklı şekillerde saldırıya uğrayabilir ve bu nedenle başka kaçan türlerini kullanarak ele alınması gerekir. örnek: var a = ''; var b = ''; e girişi tek bir ters eğik çizgidir, b komut dosyası çalışır. Kaçmak içeriğe bağlıdır. – Erlend

+0

Şimdiye kadarki en iyi cevap. – droope

0

Sadece <c:out /> belgesine güvenmek yerine, girişte kötü amaçlı betiği kodlamakla kalmayıp aynı zamanda şifreleyecek bir antixss kitaplığı da kullanılmalıdır. Mevcut en iyi kütüphane OWASP Antisamy, oldukça esnektir ve gereksinime göre (xml ilke dosyaları kullanılarak) yapılandırılabilir. ör için

Bir uygulama sadece metin girişini destekliyorsa, OWASP tarafından sağlanan çoğu jenerik policy file kullanılabilir, bu da html etiketlerinin çoğunu sterilize edip kaldırır.html etiketlerinin her türlü mi (örneğin, TinyMCE gibi) uygulama destek HTML editörler, daha esnek bir politika tüm giriş bağlayıcı nesneleri (ve @RequestBody json için @Valid ile hazırda Doğrulayıcı kullanmak gibi ebay policy file

4

kullanmak olabilir Benzer şekilde, eğer, bkz https://dzone.com/articles/spring-31-valid-requestbody). Yani @org.hibernate.validator.constraints.SafeHtml benim için iyi bir çözüm.

hazırda SafeHtmlValidatororg.jsoup bağlıdır, yüzden bir daha proje bağımlılıkları eklemek için ihtiyaç duyulan: denetleyicisi değer <script>alert(123)</script> ile güncelleştirme girişimi alanda

@NotEmpty 
@SafeHtml 
protected String name; 

ile fasulye User için

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

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

veya

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

varsayılan mesajla @RequestBody için MethodArgumentNotValidException bağlayıcı ve için BindException atılır:

name may have unsafe html content 

Validator devam eden önceki gibi, bağlanma için iyi çalışır. Uygulamalar XSS konuya http://topjava.herokuapp.com/

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

çözüme test edilebilir formu göndererek anında formunda tüm textfields filtre etmektir.

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 kod adı İkinci sınıf:

paket com.filter;

 <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> 

/* tarayıcıdan yapılan her istek için, bu arayacak gösterir o: Tek şey kaldı

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; 
    } 

web.xml dosyasında XML giriştir CrossScriptingFilter sınıfı. //www.joelonsoftware - http: tüm bileşenleri ayrıştırmak hangi/elemanları * Yanlış Look

İlgili konular