正确做法是入库原样存储html,输出时按上下文编码:html正文用htmlspecialchars,属性值同理,js中用json_encode,富文本必须用htmlpurifier清洗后输出。

一、入库:保持原始 HTML,禁用任何自动转义
PHP 8.5.7 + PDO/MySQLi 默认不会转义 HTML —— 这是好事,要维持它:
- 绝不调用
htmlspecialchars()、addslashes()或strip_tags()后再存库,否则富文本会变成乱码(如<p>Hello</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="overflowclass">Wechat HTML Publisher</a> <p class="overflowclass">直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>) - 避免手写
Db::execute("INSERT INTO ... '$html'")这类拼接 SQL,它既可能二次转义,更会引发 SQL 注入 - 务必使用预处理语句:
$stmt = $pdo->prepare("INSERT INTO posts(content) VALUES (?)"); $stmt->execute([$rawHtml]); - 数据库字段类型设为
TEXT或MEDIUMTEXT,别用VARCHAR(255)截断长 HTML
二、输出:按位置决定怎么编码,不是“统一转义”
同一段 HTML 可能出现在不同地方,每种场景需不同处理:
- 渲染到 HTML 正文区域(如
@#@#@#@#@#@#@#@#@#@0(兼容 PHP 8.5+) - 配置白名单:
'HTML.Allowed' => 'p,b,i,strong,em,a[href|title],img[src|alt|width|height]' - 只在输出前调用:
$clean = $purifier->purify($rawHtml); echo $clean; - 别在入库时 purify —— 后台可能需要原始 HTML 编辑,且 purify 结果不可逆
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










