我阅读了owasp.org文章,内容涉及XSS攻击及其防范方法。
在示例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验证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
注释。
您有处理此类问题的经验吗?我可以在黑名单中添加某种新模式吗?
答案 0 :(得分:1)
@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