htmlspecialchars 这个函数本身是PHP内置的,它存在于任何PHP环境中,但在织梦CMS中,你不需要直接去寻找它的“安装位置”,而是要理解织梦在哪些地方、为什么使用它,以及如何自定义它的行为。

下面我将从几个层面为你解答:
htmlspecialchars 的作用是什么?
首先要明白这个函数是做什么的,它的主要作用是将一些特殊的HTML字符转换为HTML实体,从而防止XSS(跨站脚本)攻击。
&会被转换为&- 会被转换为
" - 会被转换为
' <会被转换为<>会被转换为>
当用户提交的内容(如评论、文章内容)中包含 <script> 标签时,经过 htmlspecialchars 处理后,它会变成 <script>,浏览器就不会再把它当作一个可执行的脚本标签来解析,而是直接显示文本内容,从而保证了网站的安全。
织梦CMS在哪里使用了 htmlspecialchars?
织梦CMS为了安全性,在输出数据到浏览器之前,会大量使用 htmlspecialchars 来处理来自数据库或其他不可信来源的数据,这些处理通常封装在织梦自己的函数中。
主要有两个核心函数:
A. htmlspecialchars() 织梦自定义版
织梦并没有直接使用PHP原生的 htmlspecialchars,而是封装了一个自己的版本,文件路径是:
/include/helpers helper.helper.php
函数定义:
// 文件路径: /include/helpers/helper.helper.php
if ( ! function_exists('htmlspecialchars'))
{
function htmlspecialchars($string, $flags = null, $encoding = 'UTF-8', $double_encode = true)
{
// ... 一些判断逻辑 ...
if ($flags === null) {
$flags = ENT_QUOTES; // 默认转换单引号和双引号
}
// 调用PHP原生函数
return call_user_func_array('htmlspecialchars', array($string, $flags, $encoding, $double_encode));
}
}
为什么这么做?
这是一个向下兼容的策略,在一些非常古老的PHP版本中,可能没有内置 htmlspecialchars 函数,织梦通过这种方式,确保在任何环境下都能使用这个功能。
使用场景:
当你看到 htmlspecialchars($var) 这样的代码时,它实际上是在调用这个封装好的函数,这个函数在织梦的底层模板引擎中被广泛调用。
B. 更重要的:HtmlSpecialChars() (首字母大写)
这个是你真正需要关注的函数,也是织梦模板输出数据时进行安全转义的核心函数。
函数定义:
同样在 /include/helpers/helper.helper.php 文件中。
作用:
这个函数的主要作用是在模板解析的过程中,对变量进行自动的HTML转义,它默认会对 gbk 和 utf-8 编码的字符串进行特殊处理,确保中文字符不会被错误地转义。
使用场景:
你不需要在模板文件(.htm)中手动调用它,织梦的模板引擎在解析 {dede:field.name/} 或 [field:name/] 这样的标签时,会自动调用这个函数来处理输出内容。
举例:
假设你的文章标题里包含一个JS代码: <script>alert('xss')</script>"
在你的模板文件 article_article.htm 中,你这样写:
<h2>{dede:field.title/}</h2>
在最终输出到浏览器时,织梦会自动调用 HtmlSpecialChars() 函数处理 field.title 的值,最终浏览器收到的HTML源码是:
<h2>我的标题 <script>alert('xss')</script></h2>
这样,恶意代码就被安全地转义了。
如何自定义或禁用 htmlspecialchars 的行为?
在某些情况下,你可能不希望内容被转义,比如在文章内容详情页,你希望 <p>、<strong> 等HTML标签能够正常生效。
有几种方法可以实现:
在模板中使用函数修饰(推荐)
在织梦模板中,你可以使用 符号来对变量应用函数,以移除默认的HTML转义。
移除所有HTML标签转义:
使用 stripslashes 和 htmlspecialchars 的反向操作,但最直接的方法是使用 RemoveXSS(如果可用)或者直接使用 raw 标签(如果模板引擎支持)。
在旧版织梦中,更常见的做法是:
{dede:field.body function='htmlspecialchars_decode(@me)'/}
注意: htmlspecialchars_decode 只能将 < 等转义字符转回 <,但不能阻止织梦模板引擎在输出前进行的 htmlspecialchars 转义,所以这个方法不一定总是有效。
更可靠的方法:使用 runphp='yes'
这是最灵活、最推荐的方法。
示例:在文章内容页正常显示HTML标签
在模板文件 article_article.htm 中:
{dede:field.body runphp='yes'}
// @me 代表原始的 field.body 值
// 因为我们不希望在这里进行任何转义,所以直接输出
@me;
{/dede:field.body}
或者,如果你想先处理一下再输出(比如过滤一些危险的JS标签):
{dede:field.body runphp='yes'}
// 这里可以调用自定义的安全过滤函数
// 调用一个名为 'remove_evil_tags' 的函数
@me = remove_evil_tags(@me);
{/dede:field.body}
修改织梦核心文件(极其不推荐!)
理论上,你可以去修改 /include/dedetemplate.class.php 等模板引擎的核心文件,找到调用 HtmlSpecialChars 的地方并注释掉或删除。
这非常危险!
- 破坏安全性:会让你的网站暴露在XSS攻击的风险之下。
- 升级困难:下次织梦升级时,你的修改会被覆盖,需要重新修改。
- 容易出错:修改核心文件可能导致意想不到的模板渲染问题。
除非你非常清楚自己在做什么,并且有充分的理由,否则绝对不要修改核心文件。
| 问题 | 答案 |
|---|---|
htmlspecialchars 在哪? |
PHP内置函数:存在于任何PHP环境中。 织梦自定义封装:位于 /include/helpers/helper.helper.php,向下兼容。核心转义函数: HtmlSpecialChars(),位于同文件,是模板安全的基石。 |
| 织梦为什么用它? | 安全性:防止XSS攻击,将用户提交的恶意HTML代码(如<script>)转义为纯文本。 |
| 我需要手动调用吗? | 通常不需要,织梦的模板引擎会自动调用 HtmlSpecialChars() 来处理标签输出。 |
| 如何让HTML标签正常显示? | 使用 runphp='yes',在模板标签中添加 runphp='yes' 属性,然后直接输出 @me 变量,可以绕过默认的HTML转义,这是最安全、最推荐的方法。 |
