Есть небольшое веб приложение для обмена сообщениями, вроде форума...
Когда пользователь пишет своё сообщение, то оно попадает в бд, затем другие пользователи могут это сообщение прочесть... В сообщении, которое вводит пользователь, есть возможность менять размер шрифта, цвет и т.д. в результате чего, в базу попадает сообщение в виде: <font color="#ffff00">1231sdasd</font><b style=""><font color="#ffff00">asdasd</font></b>. При запросе этого сообщения, контроллер его именно в таком виде и отдаёт, затем я его вставляю в страничку с помощью Thymeleaf. Проблема заключается в том, что на страничке отображаются не цветные слова, а сами теги, так как < и > автоматический заменяются на < и >. Как спастись от замены тегов на спецсимволы?)
Решил вопрос следующим образом:
Полученные сообщения вывожу с помощью <tag th:utext="${myvar}"></tag>, так как th:utext не экранирует теги на выходе. А перед записью в базе я проверяю само сообщение небольшой самодельной защитой:
private String xssSecurity(String message) {
char[] chars = message.toCharArray();
boolean closeTag = false;
for (int i = 0, j; i < chars.length; i++) {
char c = chars[i];
if (chars[i] == '<') {
System.out.println(chars.length);
for (j = i; j < chars.length; j++) {
char h = chars[j];
if (chars[j] == ' ' || chars[j] == '>') {
String tag = message.substring(i + 1, j);
System.out.println(tag);
if (tag.matches("/?b") || tag.matches("/?font") || tag.matches("/?i")) {
closeTag = true;
break;
} else {
chars[i] = '•';
break;
}
}
}
}
if (chars[i] == '>') {
if (!closeAccept) {
chars[i] = '·';
} else {
closeTag = false;
}
}
}
return new String(chars).replaceAll("·", ">").replaceAll("•", "<");
}
В итоге я получаю сообщение со всеми экранированными тегами, кроме разрешенных(в моём случае это b, i и font).
Продвижение своими сайтами как стратегия роста и независимости