Я нашел этот вопрос, работая с методом, который по принципу черного ящика не может доверять, что входящая строка либо закодирована в виде HTML-сущности, либо нет.
Я адаптировал функцию Питера Боутона так, чтобы она могла безопасно использоваться в строках, которые еще не обрабатывались с помощью HTML-сущностей. (Единственный случай, когда это имеет значение, - это когда в целевой строке присутствуют свободные амперсанды, то есть "Cats & Dogs".) Эта измененная версия также будет несколько изящно работать при любой непредвиденной ошибке синтаксического анализа XML.
<cffunction name="decodeHtmlEntity" returntype="string" output="false">
<cfargument name="str" type="string" hint="&##<number>; or &<name>;" />
<cfset var XML = '<xml>#arguments.str#</xml>' />
<cfset var XMLDoc = '' />
<!--- ampersands that aren't pre-encoded as entities cause errors --->
<cfset XML = REReplace(XML, '&(?!(\##\d{1,3}|\w+);)', '&', 'all') />
<cftry>
<cfset XMLDoc = XmlParse(XML) />
<cfreturn XMLDoc.XMLRoot.XMLText />
<cfcatch>
<cfreturn arguments.str />
</cfcatch>
</cftry>
</cffunction>
Это будет безопасно поддерживать следующий вариант использования:
<cffunction name="notifySomeoneWhoCares" access="private" returntype="void">
<cfargument name="str" type="string" required="true"
hint="String of unknown preprocessing" />
<cfmail from="process@domain.com" to="someoneWhoCares@domain.com"
subject="Comments from Web User" format="html">
Some Web User Spoke Thus:<br />
<cfoutput>#HTMLEditFormat(decodeHTMLEntity(arguments.str))#</cfoutput>
</cfmail>
</cffunction>
Эта функция теперь невероятно полезна для обеспечения безопасности содержимого, отправляемого через Интернет, до тех пор, пока оно не будет отправлено по электронной почте или отправлено в таблицу базы данных.
Надеюсь, это поможет.