Catch-All HTML 编码实体
Catch-All HTML Encoding Entities
我一直认为我已经想出了一个完美的函数来解决我的问题,但我最终无缘无故地发现了一些破坏它的东西。我不完全理解 htmlentities / htmlspecialchars 是如何工作的,或者它们究竟转换了什么,所以我想这会有所帮助...
我混合使用新旧数据库,user-input
-
- 旧数据库有时会使用 htmlentities() 对字符进行编码
里面的数据
- 旧数据库偶尔包含 HTML 内容(需要剥离)
- 新数据库字符在插入前未编码
-
- 用户输入可能包含令人讨厌的
<script>
或 <script>
&lt;script/&gt;
- 新数据库字符在插入前未编码
我正在尝试创建一个 catch-all 函数,使每个案例(#1 和 #2)既安全又美观
function html_enc($text){
while($text!==html_entity_decode($text,ENT_HTML5,'UTF-8')){
$text=html_entity_decode($text,ENT_HTML5,'UTF-8');
}
$text=strip_tags($text);
$text=htmlentities($text,ENT_HTML5,'UTF-8');
return $text;
}
我以为我已经用这个函数确定了第 1 点,但是当我在页面标题上使用它时,它在标题中有双引号,并且页面吐出 "
而不是 ",但是页面的其余部分显示“...我不明白为什么 <title>
元素与正常的 body 元素不同...有人知道如何解决这个小问题吗?或者更好的功能/改进的建议?
对于第 2 点,这似乎也是最好的解决方案 - 我还没有通过用户输入和页面/文本区域中的标准显示来破坏此功能
也在附注中,但为了安全起见;我的代码假设用户输入是以 HTML 形式发布的 UTF-8,我的所有页面都已指定
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
用户是否可以提交不同的编码?我想是的,这将如何影响我的功能?有没有可能抓住这个?
通过指定 ENT_HTML5
,您丢失了默认标志 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
,因此不会对引号进行解码。
您需要 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5
或 ENT_QUOTES | ENT_HTML5
。
我一直认为我已经想出了一个完美的函数来解决我的问题,但我最终无缘无故地发现了一些破坏它的东西。我不完全理解 htmlentities / htmlspecialchars 是如何工作的,或者它们究竟转换了什么,所以我想这会有所帮助...
我混合使用新旧数据库,user-input
-
- 旧数据库有时会使用 htmlentities() 对字符进行编码 里面的数据
- 旧数据库偶尔包含 HTML 内容(需要剥离)
- 新数据库字符在插入前未编码
-
- 用户输入可能包含令人讨厌的
<script>
或<script>
&lt;script/&gt;
- 新数据库字符在插入前未编码
- 用户输入可能包含令人讨厌的
我正在尝试创建一个 catch-all 函数,使每个案例(#1 和 #2)既安全又美观
function html_enc($text){
while($text!==html_entity_decode($text,ENT_HTML5,'UTF-8')){
$text=html_entity_decode($text,ENT_HTML5,'UTF-8');
}
$text=strip_tags($text);
$text=htmlentities($text,ENT_HTML5,'UTF-8');
return $text;
}
我以为我已经用这个函数确定了第 1 点,但是当我在页面标题上使用它时,它在标题中有双引号,并且页面吐出 "
而不是 ",但是页面的其余部分显示“...我不明白为什么 <title>
元素与正常的 body 元素不同...有人知道如何解决这个小问题吗?或者更好的功能/改进的建议?
对于第 2 点,这似乎也是最好的解决方案 - 我还没有通过用户输入和页面/文本区域中的标准显示来破坏此功能
也在附注中,但为了安全起见;我的代码假设用户输入是以 HTML 形式发布的 UTF-8,我的所有页面都已指定
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
用户是否可以提交不同的编码?我想是的,这将如何影响我的功能?有没有可能抓住这个?
通过指定 ENT_HTML5
,您丢失了默认标志 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
,因此不会对引号进行解码。
您需要 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5
或 ENT_QUOTES | ENT_HTML5
。