Catch-All HTML 编码实体

Catch-All HTML Encoding Entities

我一直认为我已经想出了一个完美的函数来解决我的问题,但我最终无缘无故地发现了一些破坏它的东西。我不完全理解 htmlentities / htmlspecialchars 是如何工作的,或者它们究竟转换了什么,所以我想这会有所帮助...

我混合使用新旧数据库,user-input

    • 旧数据库有时会使用 htmlentities() 对字符进行编码 里面的数据
    • 旧数据库偶尔包含 HTML 内容(需要剥离)
    • 新数据库字符在插入前未编码
    • 用户输入可能包含令人讨厌的 <script>&lt;script&gt; &amp;lt;script/&amp;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 点,但是当我在页面标题上使用它时,它在标题中有双引号,并且页面吐出 &quot; 而不是 ",但是页面的其余部分显示“...我不明白为什么 <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_HTML5ENT_QUOTES | ENT_HTML5