Подтвердить что ты не робот

Выйти из HTML-объектов в JSP/JSPX: нет решения проблемы, которое даже не должно существовать?

Мы используем jspx в качестве механизма шаблонов. У нас есть дюжина экранов с сотнями выражений el, таких как ${user.firstName} или "$ {mail.subject}"

И все это HTML-код не экранируется по умолчанию. Если бы было что-то с < или "в полевом экране не удастся. Мы всегда можем использовать fn: escapeXml, но делать это во всех местах очень скучно.

1) Есть ли способ сделать эвакуацию по умолчанию?

Единственный способ, которым я знаю, - взломать JSP-компилятор (например, jasper для tomcat). Но это не путь.

2) Почему кому-то может понадобиться неограниченный HTML в el? Хранение HTML вне шаблона (например, в базе данных) не является хорошей практикой.

3) Я уверен, что механизм шаблонов должен обрабатывать его автоматически (как это делается в XSLT), почему он должен заботиться об этом? Ручное экранирование (fn: escapeXml) пахнет экранированием SQL-кода (которое используется вместо JDBC setParam): шаблонный код и хорошее место для sql-injection (межсайтовый скриптинг в нашем случае).

4b9b3361

Ответ 1

1) Есть ли способ выполнить спуск по умолчанию?

Не в винтажном JSP. Его преемник Facelets, однако, избегает их по умолчанию. Единственный способ отключить экранирование - использовать <h:outputText value="#{bean.foo}" escape="false" /> вместо #{bean.foo}.


2) Почему кому-то может понадобиться неограниченный HTML в el? Хранение HTML вне шаблона (например, в базе данных) не является хорошей практикой.

Сохранение sanitized HTML, однако, более чем обычно делается. Например. разрешить небольшое подмножество невинных тегов HTML, таких как <p>, <b>, <i> и на которых атрибуты on* уже удалены.


3) Я уверен, что механизм шаблонов должен обрабатывать его автоматически (как это делается в XSLT), почему он должен заботиться об этом? Ручное экранирование (fn: escapeXml) пахнет экранированием SQL-кода (которое используется вместо JDBC setParam): шаблонный код и хорошее место для sql-injection (межсайтовый скриптинг в нашем случае).

JSP - это древняя технология просмотра. Это не очень гибкий механизм шаблонов.

SQL-инъекции, как правило, следует предотвращать, просто используя PreparedStatement вместо Statement (или используя структуру ORM вместо "raw JDBC", например, поскольку ваша проблема XSS может быть предотвращена путем использования только структуры MVC "raw JSP" ).


Что касается вашей конкретной проблемы, то вы можете решить это в основном 4 способами:

  • Укусите пулю и замените все EL-in-template-текст, который повторно вводит управляемый пользователем ввод fn:escapeXml() или <c:out> и научит вас и вашу команду обращать внимание на это в будущем. Подсказка, немного достойная IDE, такая как Eclipse, содержит регулярные выражения для поиска и замены во всех файлах.

  • Имеют вид перехватчика БД, который удаляет вредоносный HTML перед вставкой в ​​БД. При необходимости запустите DB script для дезинфекции существующих данных. Это, однако, более обходное решение, чем реальное решение.

  • Замените JSP EL resolver на пользовательский, который ускользает от всего HTML. Тем не менее это имеет тот недостаток, что вы никогда не сможете показать простой HTML по EL, когда это действительно необходимо.

  • Используйте приличную среду MVC со встроенным HTML-экранированием. Это, однако, больше работы, чем просто фиксация отдельных выражений EL.