【问题标题】:Catch-All HTML Encoding Entities包罗万象的 HTML 编码实体
【发布时间】:2022-01-21 11:21:48
【问题描述】:

我一直在想我已经想出了完美的功能来解决我的问题,但我最终找到了一些没有明显原因的东西。我不完全理解 htmlentities / htmlspecialchars 是如何工作的,或者它们究竟转换了什么,所以我想这会有所帮助......

我混合了新旧数据库以及用户输入

    • 旧数据库有时使用 htmlentities() 对字符进行编码 数据内部
    • 旧数据库偶尔会在内容中包含 HTML(需要剥离)
    • 新数据库字符在插入之前未编码
    • 用户输入可能包括讨厌的<script><script> <script/>
    • 新数据库字符在插入之前未编码

我正在尝试创建一个包罗万象的功能,让每个案例(#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> 元素会与正常主体不同...有谁知道如何解决这个小问题?还是建议更好的功能/改进?

对于第 2 点,这似乎也是最好的解决方案 - 我还没有通过用户输入和标准显示在页面/文本区域中破坏此功能

另外,为了安全起见;我的代码假设用户输入是以 HTML 形式发布的 UTF-8,我的所有页面都已指定

<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

用户是否可以提交不同的编码?我想它是,这将如何影响我的功能?有可能抓住这个吗?

【问题讨论】:

    标签: php html encoding character-encoding page-title


    【解决方案1】:

    通过指定ENT_HTML5,您丢失了默认标志ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,因此不会对引号进行解码。

    您需要ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5ENT_QUOTES | ENT_HTML5

    【讨论】:

    • 如此简单的修复,非常感谢!
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2011-02-12
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多