PHP htmlspecialchars()函数详解

PHP htmlspecialchars()函数详解

htmlspecialchars函数多常用于防止xss攻击,htmlspecialchars函数要转义单引号需要设置第二个参数为ENT_QUOTES,转义双引号需要设置第二个参数为ENT_NOQUOTES

一、定义和用法

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

复制代码
& (& 符号)  ===============  &
" (双引号)  ===============  "
' (单引号)  ===============  '
< (小于号)  ===============  &lt;
> (大于号)  ===============  &gt;

<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

上面代码的 HTML 输出如下(查看源代码):

复制代码
<!DOCTYPE html>
<html>
<body>
This is some &lt;b&gt;bold&lt;/b&gt; text.
</body>
</html>

二、第二个参数

复制代码
htmlspecialchars(string,flags,character-set,double_encode)

第二个参数flags可选。规定如何处理引号、无效的编码以及使用哪种文档类型。可用的引号类型:

ENT_COMPAT - 默认。仅编码双引号。

ENT_QUOTES - 编码双引号和单引号。

ENT_NOQUOTES - 不编码任何引号。

注意:htmlspecialchars函数多常用于防止xss攻击,htmlspecialchars函数要转义单引号需要设置第二个参数为ENT_QUOTES,转义双引号需要设置第二个参数为ENT_NOQUOTES

复制代码
<?php

$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
echo "<br>";
$str = "Jane & 'Tarzan'";
echo htmlspecialchars($str, ENT_COMPAT); // 默认,仅编码双引号
echo "<br>";
echo htmlspecialchars($str, ENT_QUOTES); // 编码双引号和单引号
echo "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES); // 不编码任何引号
?>

浏览器输出:

复制代码
This is some <b>bold</b> text.
Jane & 'Tarzan'
Jane & 'Tarzan'
Jane & 'Tarzan'

查看源代码:

复制代码
This is some &lt;b&gt;bold&lt;/b&gt; text.<br>
Jane &amp; 'Tarzan'<br>
Jane &amp; &#039;Tarzan&#039;<br>
Jane &amp; 'Tarzan'

三、防止绕过

编码-将HTML转为实体

php 复制代码
/**
 * 将HTML转为实体
 * @param string $str     需要处理的字符串
 * @param string $charset 编码,默认为gb2312
 * @return string
 */
function html_to_entities($str, $charset = "gb2312")
{
   // 参数判断
    if(empty($str)) return "";
    
    // 1.将常用的预定义字符转为实体
    $new_str = htmlspecialchars($str, ENT_QUOTES, $charset);

    // 2.替换反斜杠
    $new_str = preg_replace("/\\\/", "&#092;", $new_str);

    // 3.替换斜杠
    $new_str = preg_replace("/\//", "&#47;", $new_str);
    
    return $new_str;
}

解码-将实体转为HTML

php 复制代码
/**
 * 将实体转为HTML
 * @param string $str     需要处理的字符串
 * @return string
 */
function entities_to_html($str)
{
   // 参数判断
    if(empty($str)) return "";
    
    // 1.将实体转为预定义字符
    $new_str = htmlspecialchars_decode($str, ENT_QUOTES);

    // 2.替换反斜杠实体
    $new_str = str_replace("&#092;", "\\", $new_str);

    // 3.替换斜杠实体
    $new_str = str_replace("&#47;", "/", $new_str);
    
    return $new_str;
}

四、小结

一般使用htmlspecialchars将字符串的预定义字符转为实体的时候,需要传递ENT_QUOTES 参数,因为如果不传递参数,默认的只对双引号做转换,而单引号不做转换,这样不能起到防止SQL注入的风险,所以,正式用的时候,我们希望双引号和单引号及其他可能引起SQL注入的都需要进行实体转换,存入数据库,所以,以后在用这个函数处理的时候,应该传入ENT_QUOTES 参数,然后再结合preg_replace方法将斜杠、反斜杠替换为实体,这样就完美了。

相关推荐
码云数智-大飞12 小时前
PHP 接口开发规范:统一返回格式、异常处理与参数校验
开发语言·php
dadaobusi13 小时前
仿真边界处理
开发语言·php
微学AI15 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php
峥嵘life16 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
weixin_BYSJ198716 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
xuefeiniao16 小时前
CentOS + 宝塔服务器偶发 SSH、面板、网站全部无法访问排查记录(PHP-FPM 内存耗尽案例)
服务器·centos·ssh·php
神州世通1 天前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦1 天前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AC赳赳老秦2 天前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
Vae_Mars2 天前
C#中多线程异步操作的方法-Parallel.ForEachAsync
开发语言·c#·php