Реализация ESAPI для тегов пружинной формы

Как мы можем реализовать кодирование вывода ESAPI в приложении с использованием java и spring-mvc.

Прочитал много постов и увидел это:

<%@ page import="org.owasp.esapi.*" %>
<input type="hidden" name="hidden" value="<%out.print(ESAPI.encoder().encodeForHTML(content));%>"/>

Но в моем приложении все jsps используют теги пружинной формы, такие как следующие:

<td>Number: 
        <form:input path="someNo" size="20" maxlength="18" id="firstfield" onkeypress="return PressAButton('submithidden');"/></td>

Как я могу реализовать ESAPI для приведенного выше кода? есть ли другой способ реализовать кодировку вывода, например, создать фильтр или что-то в этом роде? Любые предложения очень ценятся!


person user1609085    schedule 16.01.2014    source источник
comment
Я не вижу, где spring здесь кодирует ваше значение. Вы пытались установить htmlEscape="true" в качестве атрибута для тега form:input?   -  person avgvstvs    schedule 17.10.2014


Ответы (2)


После небольшого изучения пружинных тегов оказалось, что привязка данных происходит в коде фреймворка, что не позволяет вам применять какое-либо экранирование в jsp.

Во-первых, полубыстрая победа может заключаться в том, что весь вывод по умолчанию будет экранировать HTML. Добавьте эту запись в web.xml:

<context-param>
  <param-name>defaultHtmlEscape</param-name>
  <param-value>true</param-value>
</context-param>

Единственная проблема здесь заключается в том, что экранирование вывода - это БОЛЬШАЯ боль... правила экранирования html отличаются, когда ваше значение будет передано в виде данных в атрибут HTML или функцию Javascript. И могут быть некоторые части вашего приложения, где вы НЕ хотите экранировать html, но вы должны иметь возможность переопределять те с атрибутом тега формы htmlEscape="false", когда вам нужно.

Что вам нужно, так это иметь возможность перехватывать часть тегов Spring, где он привязывает HTML к форме, но вам нужно иметь возможность сделать это, чтобы вы могли уйти в зависимости от того, где он находится. Правила экранирования отличаются для HTMLAttribute, в отличие от простого HTML, и если значение будет передано в виде данных функции javascript. Таким образом, решение Spring защищает только одну категорию атак.

Это единственные выходы, которые я вижу, все они потребуют работы:

  1. Используйте теги JSTL вместо тегов Spring, чтобы вы могли писать свои переменные с помощью ${thisSyntax} и заключать их в теги esapi следующим образом:

    <c:out value="<esapi:encodeForHTML>${variable}</esapi:encodeForHTML>"/>

  2. Следуйте решению, как то, что @A. Павел выдвинул, где вы делаете свой контекст, убегающий обратно на стороне контроллера. Я знаю, что вы считаете, что это не вариант, но следующее решение, которое я предлагаю, еще не проверено.

  3. Реализуйте собственную библиотеку тегов, которая является подклассом [org.springframework.web.servlet.tags.form.InputTag][1], в частности метод writeValue. Хотя esapi во многом препятствует, я бы порекомендовал взглянуть на новый проект Encodert, чтобы показать вам, насколько сложно кодировать выходные данные. В идеале ваша библиотека тегов позволит вам использовать кодировщик esapi или этот новый API.

person avgvstvs    schedule 17.10.2014

Просто мысль не уверена, что это то, что вы ищете.

Можете ли вы использовать приведенный ниже код в Java и изменить данные в самом bean-компоненте, а затем отправить его в пользовательский интерфейс.

if ( ESAPI.securityConfiguration().getLogEncodingRequired() ) {
    data = ESAPI.encoder().encodeForHTML(message);
}

Вы можете проверить приведенный ниже URL. http://www.jtmelton.com/tag/esapi/

person A Paul    schedule 20.01.2014
comment
это хорошо для целей проверки, но для кодирования вывода это не очень хорошо. Я пробовал это, но в наших отчетах об оценке вреда это по-прежнему отображается как проблема. - person user1609085; 20.01.2014
comment
Ok. Итак, ESAPI.encoder().encodeForHTML(сообщение) нельзя использовать? - person A Paul; 21.01.2014
comment
Вы, возможно, проверили это, но только для справки. stackoverflow.com/ вопросы/11659287/ - person A Paul; 21.01.2014
comment
Тоже не очень уверен, но можешь попробовать что-то вроде. ‹form:input path=someNo placeholder=‹esapi:encodeForHTML›${myvar}‹/esapi:encodeForHTML› /› - person A Paul; 21.01.2014
comment
по крайней мере ESAPI.encoder().encodeForHTML(message) мы не хотим использовать это в контроллере. У меня нет переменных в jsp ${myVar}. Как-то мне нужно использовать от path до encodeForHtml - person user1609085; 21.01.2014
comment
Ok. Я не уверен, но вы пробовали что-то вроде. ‹form:input path=‹esapi:encodeForHTML›someNo‹/esapi:encodeForHTML›. Хотя я не уверен, что это вообще сработает. - person A Paul; 21.01.2014
comment
это не будет работать, так как при загрузке jsp, someNo будет нулевым, что вызывает исключение нулевого указателя в jsp - person user1609085; 21.01.2014
comment
Вы не должны делать это на стороне сервера, если вы точно не знаете, что ваш сервер будет отправлять данные в браузер только навсегда. Что, если в дальнейшем вы отправляете данные через JSON API? - person Varun Achar; 08.09.2014
comment
Проблема с выходным кодированием заключается в том, что вам нужно заранее знать, в какой тип поля будут записаны ваши данные. - person avgvstvs; 17.10.2014