2014-06-18 74 views
0

我用過濾器來修復XSS。但是,當我使用fortify軟件掃描我的代碼時,XSS問題的數量沒有改變。我錯過了什麼?或Fortify無法識別過濾器?這裏是我的過濾器代碼:Can Fortify能識別servlet過濾器嗎?

public final class RequestWrapper extends HttpServletRequestWrapper { 

public RequestWrapper(HttpServletRequest servletRequest) { 
    super(servletRequest); 
} 

public String[] getParameterValues(String 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) { 
     String value = super.getParameter(parameter); 
     if (value == null) { 
      return null; 
       } 
     return cleanXSS(value); 
} 

public String getHeader(String name) { 
    String value = super.getHeader(name); 
    if (value == null) 
     return null; 
    return cleanXSS(value); 

} 

private String cleanXSS(String value) { 
    System.out.println("filter : " + value); 
    //System.out.println("afterfilter : " + (isNotEmptyOrNull(value) ? StringEscapeUtils.escapeHtml4(value) : value)); 
    //return isNotEmptyOrNull(value) ? StringEscapeUtils.escapeHtml4(value) : value; 
    if(isNotEmptyOrNull(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("script", ""); 
    } 
    System.out.println("afterfilter : " +value); 
    return value; 
} 
public static boolean isNotEmptyOrNull(String string) { 
    if (string != null && !"".equals(string.trim())) { 
     return true; 
    } 
    return false; 
} 

}

回答

0

的這裏的問題是,Fortify的沒有你cleanXSS法的規則。你將不得不做的是編寫一個自定義規則,特別是「數據流清理規則」。這將讓Fortify知道,任何從這個方法進入然後返回的數據對於XSS都是安全的。

然而,在看着你的XSS過濾器後,我必須通知你它不完整,並且不會考慮所有可能的XSS向量。我建議您使用OWASP ESAPI的XSS過濾器。 Fortify已經有了ESAPI的規則。

+0

我還要補充一點,在XSS過濾中依賴* soley *的任何XSS解決方案都是不完整的。只要XSS驗證是使用正則表達式進行的,就會至少有一個輸入會滑過。 – avgvstvs