我读过有关XSS攻击及其预防方法的owasp.org文章。

在示例2中,他们说:


  如果它们要过滤  
  

<script src=http://www.example.com/malicious-code.js></script>

%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e

\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e



我使用Bean Validation 2.0(JSR 380)来保护应用程序,并使用@SafeHtml注释来保护每个String字段。

问题是当我尝试从owasp示例测试各种模式时:

User user = new User();
user.setFirstName("aaa<img src=`~`onerror=prompt(666)>a");
user.setMiddleInitial("<script>alert(document.cookie);</script>");
user.setLastName("\"><ScRiPt>alert(document.cookie)</ScRiPt>");
user.setPhone("<scr<script>ipt>alert(document.cookie)</script>");
user.setFax("<script src=\"http://attacker/xss.js\"></script>");
user.setCellular("<script type=\"text/vbscript\">alert(DOCUMENT.COOKIE)</script>");
user.setEmail("<script src=http://www.example.com/malicious-code.js></script>");
user.setAlertMethodCd("%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e");
user.setHrid("\\x3cscript src=http://www.example.com/malicious-code.js\\x3e\\x3c/script\\x3e");
user.setOrgUserId(">\"><script>alert(\"XSS\")</script>&");
user.setAddress1("\"><STYLE>@import\"javascript:alert('XSS')\";</STYLE>");
user.setAddress2("<IMG SRC=\"javascript:alert('XSS');\">");
user.setCity("<IMG SRC=javascript:alert('XSS')>");
user.setZipCode("<IMG SRC=JaVaScRiPt:alert('XSS')>");

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Set<ConstraintViolation<User>> violations = validator.validate(user);

Iterator<ConstraintViolation<User>> iterator = violations.iterator();
while (iterator.hasNext()) {
        ConstraintViolation<User> cv = iterator.next();
        System.out.println(cv.getRootBeanClass().getName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
}
        assertEquals(14, violations.size());


实际结果:

User.fax fax should be valid
User.firstName First name should be valid
User.middleInitial middleInitialshould be valid
User.cellular cellular should be valid
User.orgUserId orgUserId should be valid
User.address2 address2 should be valid
User.phone phone should be valid
User.email Email should be valid.
User.city city should be valid
User.zipCode zipCode should be valid
User.lastName lastName should be valid
User.address1 address1 should be valid

java.lang.AssertionError:
Expected :14
Actual   :12


正如你看到的:

user.setAlertMethodCd("%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e");
user.setHrid("\\x3cscript src=http://www.example.com/malicious-code.js\\x3e\\x3c/script\\x3e");


可以通过@SafeHtml注释。

您是否有处理此类问题的经验?我可以在黑名单中添加某种新模式吗?

最佳答案

@SafeHTML对HTML实体使用非常简单的编码,这就是数据通过验证器的原因。

我建议使用非常强大的编码器(OWASP Java Encoder for example)来对抗XSS。


如果您需要更多模式来测试错误的@SafeHTML验证器,请参见=> https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet


防止XSS的最佳方法是使用WhiteList验证模式并使用良好的编码=> https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md

07-26 09:27