Ошибка кодирования ColdFusion - encodeForHTML и encodeForJavascript Капли обратного слэша

Для защиты от межсайтового скриптинга (XSS) я использую то, что рекомендует OWASP, ESAPI (Enterprise Security API). Файл esapi.jar был включен в предыдущую версию ColdFusion, но в CF10 теперь вы можете легко вызвать некоторые из этих полезных функций: encodeForJavascript(), encodeForHTML(), encodeForURL(), encodeForCSS() и encodeForHTMLAttribute().

У меня проблемы с encodeForJavascript(), я теряю обратную косую черту...

<cfoutput>
 <cfif isdefined("url.name")="">
 <!--- Here is the problem, this is identical to the original ascii32to126 string except for one char is missing, the backslash between the brackets ...Z[]... --->
 #url.name#
 <cfabort>
 </cfabort></cfif>

 <!---
 ASCII 32 thru 126
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~
 In the line below I ****** up on the ******-quotes and pounds in order to get the cfset to work
 --->
 <cfset ascii32to126="!" "##$%&'()*+,-.="" 0123456789:;<="">?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~">

 
</cfset></cfoutput>

Сначала я вызываю encodeForJavaScript() потому что мы находимся в контексте JavaScript.

Затем я вызываю encodeURIComponent() чтобы убедиться, что URL-адрес создан правильно.

Все работает нормально, но на результирующей странице я потерял обратную косую черту \. Что мне здесь не хватает?

(Да, я знаю, что мне также нужно защищать, где я #url.name#. Для этого эксперимента я этого не делал, потому что мне нужно было посмотреть источник, чтобы увидеть, соответствует ли строка исходной строке.)

** ОБНОВЛЕНИЕ ** - Я запускаю ColdFusion 10 со всеми последними исправлениями. Проблема, кажется, в encodeForJavaScript().

Сбой также с JSStringFormat(). Выполнение этого показывает, что обратная косая черта отсутствует для обоих...

<cfset ascii32to126="!" "##$%&'()*+,-.="" 0123456789:;<="">?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~">
<cfoutput>
 #encodeForHTML(encodeForJavaScript(ascii32to126))#
 #encodeForHTML(JSStringFormat(ascii32to126))#
</cfoutput>
</cfset>
3 ответа

(2+ лет спустя). По-видимому, это было исправлено Adobe или ESAPI. Все символы, включая обратную косую черту, сохраняются. Теперь я запускаю эти версии...

Серверный продукт: ColdFusion

Версия: 11,0,09,299201

Tomcat Версия: 7.0.68.0

Издание: Разработчик

Операционная система: Windows 10

Версия ОС: 10.0

Уровень обновления: C: /ColdFusion11/cfusion/lib/updates/chf11000009.jar

Adobe Driver: 5.1.3 (Build 000094)

Версия Java: 1.8.0_91

Java-поставщик: Oracle Corporation


FWIW, мы используем все функции encodeForX уже более года и только имеют проблемы, когда разработчик использует неправильный контекст. Мы строго запретили использование HTMLEditFormat и проверяем сервер Jenkins (среди других запрещенных функций и тегов), поскольку сборки выполняются в течение дня.

Вы кодируете строку для JavaScript и затем кодируете ее для URL. Я считаю, что сначала нужно кодировать URL, а затем кодировать для JavaScript. Кажется, что нет потерянных символов, когда я сравниваю вывод с незашифрованной строкой.

<cfoutput>
 <cfif isdefined("url.name")="">
 <!--- Here is the problem, this is identical to the original ascii32to126 string except for one char is missing, the backslash between the brackets ...Z[]... --->
 #url.name#
 <cfabort>
 </cfabort></cfif>

 <!---
 ASCII 32 thru 126
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~
 In the line below I ****** up on the ******-quotes and pounds in order to get the cfset to work
 --->
 <!--- Using Chr() to bypass character escaping. --->
 <cfset ascii32to126="!#chr(34)##chr(35)#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~">
 <cfdump var="#ascii32to126#">

 
</cfdump></cfset></cfoutput>

Консольный выход

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~ 

%21%22%23%24%25%26%27%28%29*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E 

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~ 

thisPage.cfm?name=%21%22%23%24%25%26%27%28%29*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E


У нас есть собственная функция кодирования, называемая ddj()...

<!---
Author: @Brian McGinity
custom version of jsStringFormat/encodeForJavaScript
--->
<cffunction name="ddj" returntype="string" output="false">
 <cfargument name="temp" required="yes" type="string">
 <!---
 <cfset var z = jsStringFormat(arguments.temp)>
 <cfreturn z>
 --->
 <cfset var="" buf="CreateObject(" java","="" "java.lang.stringbuffer")="">
 <cfset var="" len="Len(arguments.temp)">
 <cfset var="" char="">
 <cfset var="" charcode="0">
 <cfset var="" bad=" >%}\~];?@&<##{|^[" :="$+" '"="" &="" "'"="">
 <cfset buf.ensurecapacity(javacast("int",="" len+40))="">
 

 <cfloop from="1" to="#len#" index="xmlIdx">
 <cfset char="mid(arguments.temp,xmlIdx,1)">
 <cfset charcode="asc(char)">
 <cfif 32="" 126="" charcode="" lt="" or="" gt="">
 <cfset buf.append(javacast("string",="" ""))="">
 <cfelse>
 <cfif 0="" find(char,="" bad)="" gt="">
 <cfset buf.append(javacast("string",="" "\u00"="" &="" right("0"="" formatbasen(charcode,16),2)="" ))="">
 <cfelse>
 <cfset buf.append(javacast("string",="" char))="">
 </cfset></cfelse></cfset></cfif>
 </cfelse></cfset></cfif>
 </cfset></cfset></cfloop>
 </cfset></cfset></cfset></cfset></cfset></cfset></cfargument></cffunction>

Используя ddj() я могу передать строку ascii32to126 в функцию, затем сделать encodeURIComponent на ней, затем найти ее на странице и распечатать ее, а строка будет точно такой же. Кажется, отлично работает. Но делая это таким образом, я сначала кодирую JS, а затем для второго URL. Это не кажется правильным. Я всегда думал, что это должно быть наоборот. (См. Здесь). Поэтому я пытаюсь выяснить, могу ли я это сломать. Вот тестовый пример, который, кажется, работает...

<cfoutput>
 <cfif isdefined("url.name")="">
 #url.name#
 <cfabort>
 </cfabort></cfif>

 <!--- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~ --->
 <cfset ascii32to126="!" "##$%&'()*+,-.="" 0123456789:;<="">?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~">

 
</cfset></cfoutput>

licensed under cc by-sa 3.0 with attribution.