当前位置: 首页 > news >正文

PHP中HTML标签过滤的5种有效方法

什么是XSS攻击?

XSS(Cross-Site Scripting)攻击是指攻击者在网页中插入恶意脚本,当其他用户浏览该页面时,恶意脚本会被执行,从而盗取用户信息、会话令牌或进行其他恶意操作。

方法一:htmlspecialchars() - 最常用的转义方法

htmlspecialchars()是PHP中最基本的XSS防护函数,它将特殊字符转换为HTML实体:

1

2

3

4

5

<?php

$input='<script>alert("XSS攻击")</script><p>正常内容</p>';

$safe_output= htmlspecialchars($input, ENT_QUOTES,'UTF-8');

echo$safe_output;

// 输出:&lt;script&gt;alert(&quot;XSS攻击&quot;)&lt;/script&gt;&lt;p&gt;正常内容&lt;/p&gt;

参数详解:

  • ENT_QUOTES:转换双引号和单引号
  • UTF-8:指定字符编码,防止编码绕过攻击

适用场景:纯文本输出,不需要保留任何HTML格式

方法二:strip_tags() - 彻底移除HTML标签

如果你确定不需要任何HTML标签,使用strip_tags()可以彻底移除它们:

1

2

3

4

5

<?php

$input='<script>alert("XSS")</script><p>正文内容</p><b>加粗文本</b>';

$safe_output=strip_tags($input);

echo$safe_output;

// 输出:alert("XSS")正文内容加粗文本

选择性保留标签:

1

2

3

4

5

<?php

$input='<script>alert("XSS")</script><p>正文</p><b>加粗</b><i>斜体</i>';

$safe_output=strip_tags($input,'<p><b>');// 只保留<p>和<b>标签

echo$safe_output;

// 输出:<p>正文</p><b>加粗</b>斜体

  • 优点:简单直接,性能好
  • 缺点:无法过滤标签内的属性

方法三:filter_var() - 使用PHP过滤器扩展

PHP过滤器扩展提供了更规范的过滤方式:

1

2

3

4

5

6

7

8

<?php

$input='<script>alert("XSS")</script><p>正常内容</p>';

$safe_output= filter_var($input, FILTER_SANITIZE_STRING);

echo$safe_output;

// 输出:alert("XSS")正常内容

// 专门用于过滤HTML

$html_output= filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

方法四:HTMLPurifier - 企业级解决方案

对于需要保留安全HTML内容的场景,HTMLPurifier是最佳选择:

安装方法:

1

composerrequireezyang/htmlpurifier

使用示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

require_once'vendor/autoload.php';

$config= HTMLPurifier_Config::createDefault();

// 自定义配置

$config->set('HTML.Allowed','p,br,strong,em,ul,ol,li,a[href]');

$config->set('AutoFormat.RemoveEmpty', true);

$purifier=newHTMLPurifier($config);

$input='<script>alert("XSS")</script><p class="test">安全内容</p><a href="http://example.com" rel="external nofollow" rel="external nofollow" >链接</a>';

$safe_output=$purifier->purify($input);

echo$safe_output;

// 输出:<p>安全内容</p><a href="http://example.com" rel="external nofollow" rel="external nofollow" >链接</a>

优势:

  • 遵循HTML标准
  • 支持细粒度配置
  • 能过滤危险的标签属性
  • 社区活跃,持续更新

方法五:自定义过滤函数

针对特定需求,可以创建自定义过滤函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<?php

functionadvanced_xss_clean($data) {

if(empty($data))return'';

// 递归处理数组

if(is_array($data)) {

returnarray_map('advanced_xss_clean',$data);

}

// 移除NULL字节

$data=str_replace(chr(0),'',$data);

// 转换特殊字符

$data= htmlspecialchars($data, ENT_QUOTES | ENT_HTML5,'UTF-8', true);

// 移除危险的JavaScript模式

$patterns= [

'/javascript:/i',

'/vbscript:/i',

'/on\w+\s*=/i',// 移除onclick等事件属性

'/expression\s*\(/i'// 移除CSS表达式

];

foreach($patternsas$pattern) {

$data= preg_replace($pattern,'',$data);

}

return$data;

}

// 使用示例

$input='<img src="javascript:alert(1)" onclick="malicious()">';

echoadvanced_xss_clean($input);

?>

实战:根据不同场景选择防护策略

场景1:用户评论(允许有限HTML)

1

2

3

4

5

6

7

8

9

10

11

<?php

functionfilter_comment($content) {

$allowed_tags='<p><br><strong><em><ul><ol><li><a>';

$content=strip_tags($content,$allowed_tags);

// 进一步使用HTMLPurifier进行严格过滤

require_once'HTMLPurifier.auto.php';

$purifier=newHTMLPurifier();

return$purifier->purify($content);

}

?>

场景2:显示用户名(纯文本)

1

2

3

4

5

<?php

functionfilter_username($username) {

returnhtmlspecialchars(trim($username), ENT_QUOTES,'UTF-8');

}

?>

场景3:URL参数

1

2

3

4

5

6

7

8

9

<?php

functionfilter_url($url) {

$url= filter_var($url, FILTER_SANITIZE_URL);

if(filter_var($url, FILTER_VALIDATE_URL)) {

returnhtmlspecialchars($url, ENT_QUOTES,'UTF-8');

}

return'';

}

?>

完整的安全防护示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<?php

classSecurityHelper {

publicstaticfunctionxss_clean($data,$context='text') {

if(empty($data))return$data;

if(is_array($data)) {

returnarray_map([self::class,'xss_clean'],$data);

}

switch($context) {

case'html':

// 使用HTMLPurifier处理富文本

returnself::purify_html($data);

case'attribute':

// 用于HTML属性

returnself::escape_attribute($data);

case'text':

default:

// 纯文本转义

returnhtmlspecialchars($data, ENT_QUOTES,'UTF-8');

}

}

privatestaticfunctionpurify_html($html) {

require_once'HTMLPurifier.auto.php';

$config= HTMLPurifier_Config::createDefault();

$config->set('HTML.Allowed','p,br,strong,em,ul,ol,li,a[href|title]');

$purifier=newHTMLPurifier($config);

return$purifier->purify($html);

}

privatestaticfunctionescape_attribute($data) {

returnhtmlspecialchars($data, ENT_QUOTES,'UTF-8', false);

}

}

// 使用示例

$user_input= [

'username'=>'<script>alert("xss")</script>',

'comment'=>'<p>正常评论</p><script>恶意代码</script>',

'website'=>'javascript:alert(1)'

];

$cleaned_data= SecurityHelper::xss_clean($user_input);

print_r($cleaned_data);

?>

防御深度建议

  • 输入验证:在接收数据时进行严格验证
  • 输出转义:根据输出上下文进行适当的转义
  • 内容安全策略(CSP):设置HTTP头

1

header("Content-Security-Policy: default-src 'self'");

  • HttpOnly Cookie:防止Cookie被JavaScript读取
  • 框架安全特性:优先使用框架提供的安全方法

总结

XSS防护是一个多层次的过程,需要根据具体场景选择合适的过滤策略:

  • 纯文本输出:使用htmlspecialchars()
  • 完全移除HTML:使用strip_tags()
  • 保留安全HTML:使用 HTMLPurifier
  • 企业级应用:结合多种方法,建立完整防护体系

记住:永远不要信任用户输入,在显示任何用户提供的数据之前,都要进行适当的过滤和转义。

http://www.jsqmd.com/news/584495/

相关文章:

  • 低成本运行方案:OpenClaw+千问3.5-27B量化模型调优
  • GLM-OCR GPU算力优化实践:vLLM推理加速+令牌下采样,吞吐提升2.3倍
  • 使用PHP Imagick扩展将PDF转换为图片功能的完整方案
  • 光伏混合储能直流微电网simulink模型 1.直流微电网由锂电池,超级电容,光伏和直流负载组成 2
  • linux编译qt项目
  • 2026年评价高的滑台直线模组用户口碑推荐厂家 - 品牌宣传支持者
  • Nature Microbiology|质粒驱动的抗菌素耐药性进化:插入序列介导的基因失活新机制
  • 使用PHP和LibreOffice实现高效Word转PDF的完整方案
  • lingbot-depth-pretrain-vitl-14多场景落地:AR实时遮挡、3D重建、工业检测一文详解
  • 中文版Charles抓包工具,详细安装教程(附安装包)
  • YOLOv8n-face人脸检测架构:6MB模型实现92%精度与25ms延迟的企业级方案
  • 阶跃星辰(Step):前微软小冰之父的 AI 豪赌
  • 美团LongCat-AudioDiT:革新波形潜空间的TTS模型
  • Qwen3.5-9B快速上手:3步启动WebUI(supervisorctl restart)超详细步骤
  • 智能音乐库重命名大师:自动识别音频元数据,支持模板自定义与序号补零,批量规范化音乐文件名
  • java 1.8 安装配置教程,详细图文(附安装包)
  • 【技术干货】Gemma 4 上手深度指南:本地多模态大模型的新基线
  • 51单片机第二章
  • Klipper固件全攻略:从配置到优化解决3D打印核心难题
  • OpenClaw+千问3.5-9B自动化:微信公众号文章定时发布
  • 线程池项目(1)
  • OpenClaw多通道告警:SecGPT-14B检测结果同步邮件与钉钉
  • 创建基础数据表后数据无法保存怎么排查_权限设置与回滚处理
  • 一个工科生的电机控制实验笔记
  • C++ 类和对象(下)核心总结
  • 如何用共享线程处理跨页面的数据同步冲突与锁定机制
  • OpenClaw备份与恢复:千问3.5-9B配置迁移完整流程
  • 月之暗面 Kimi 进阶:从长文本到 AI 搜索——最懂中国用户的AI助手
  • PregelProtocol——定义了“LangChain执行体“最小功能集
  • 【Web3】智能合约质量保障工程:从单元测试到 Gas 效能优化