encodeForHtml () против htmlEditFormat ()

encodeForHtml() (новое в CF10) противhtmlEditFormat(), насколько они разные?

Ответы на вопрос(2)

чие заключается в том, что HTMLEditFormat () просто заменяет «плохой». струны, как&, < а также> с хорошими строками, как&amp;, &lt; а также&gt; в то время как EncodeForHTML () умнее, с одним преимуществом он может распознавать контент, который уже закодирован, и не кодировать его дважды.

Например, если пользователь отправил следующий контент на ваш сайт:

<div>
Here is <i>test</i> html content includes<br/>
<script>alert('hello')</script>
Notice how &amp; rendered with both functions.
</div>

Как HTMLEditFormat (), так и EncodeForHTML () будут правильно экранировать тег & lt; & amp; и "& gt;" персонажи. Но HTMLEditFormat () будет слепо кодировать& опять так, что ваш вывод выглядит так:

... how &amp;amp; rendered ...

Где бы это выглядело в противном случае с encodeForHTML ():

... how &amp; rendered ...

HTMLEditFormat () не может сказать, что амперсанд уже был закодирован, поэтому он перекодировал его снова. Это тривиальный пример, но он демонстрирует, как библиотеки ESAPI умнее и, следовательно, более безопасны.

Суть в том, что нет причин использовать HTMLEditFormat () в CF10 +. Для максимальной защиты вы должны заменить функции форматирования на функции кодирования.

Полный пример, приведенный выше, и дополнительные сведения приведены в isummation:http://www.isummation.com/blog/day-2-avoid-cross-site-scripting-xss-using-coldfusion-10-part-1/

Решение Вопроса

что это то же самое, что и функция encodeForHTML в Java-OWASP ESAPI. Более безопасно, чтобы избежать атаки XSS, чтобы использовать контент в HTML.

<cfsavecontent variable="htmlcontent">
<html>
    <head>
        <script>function hello() {alert('hello')}</script>
    </head>
    <body>
        <a href="#bookmark">Book Mark &amp; Anchor</a><br/>
        <div class="xyz">Div contains & here.</div>
        <IMG     SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#    x27&#x58&#x53&#x53&#x27&#x29>
    <IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>
</body>
</html></cfsavecontent>

<cfoutput>#htmleditformat(htmlcontent)#</cfoutput>
<br />
<cfoutput>#encodeforhtml(htmlcontent)#</cfoutput>
 15 мая 2012 г., 16:48
Ну, encodeForHtml () является частью набора: encodeForCss (), encodeForJavascript (), encodeForHtmlAttribute () и т. Д. Предполагается, что он также должен выходить за пределы оригинального htmlEditFormat ().
 15 мая 2012 г., 17:15
Поскольку они используют разные выходные данные, они добавили новый тег как часть вышеупомянутого набора, а не изменили существующий тег. Это помогает поддерживать обратную совместимость с существующим кодом.
 15 мая 2012 г., 16:17
Кажется странным, что они не просто улучшат ранее существующий тег с помощью другого атрибута, чтобы сделать его более безопасным, либо просто улучшат его из коробки.
 15 мая 2012 г., 20:05
Чем больше я думаю об этом, тем больше меня беспокоит то, почему старые функции специально не помечены как устаревшие. Для меня это просто означает, что во время новых разработок наблюдается некоторое использование более старых, всегда использующих более новые функции.
 15 мая 2012 г., 17:59
Я думаю, что это также рискует загромождать язык, когда у вас есть несколько функций (помимо этих HTML, упомянутых затем две JS), которые на первый взгляд, кажется, делают то же самое, но на самом деле они не делают. Это заставляет меня задуматься, в какой момент у меня должна быть веская причина использовать HTMLEditFormat () вместо EncodeForHTML ()? Когда 10 была еще в бета-версии, и я прочитал документы, этот вопрос возник у меня в голове и с тех пор скрывается там.

Ваш ответ на вопрос