我读过有关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