0

0

DataTables教程:安全处理数据中的HTML标签,防止意外渲染

霞舞

霞舞

发布时间:2025-12-04 10:44:20

|

875人浏览过

|

来源于php中文网

原创

DataTables教程:安全处理数据中的HTML标签,防止意外渲染

本文旨在指导开发者如何在datatables中有效防止数据中的html标签被意外渲染。通过利用datatables的`columns.render`函数,结合jquery的`$.parsehtml`方法和dom元素的`innertext`属性,我们可以安全地从包含html的数据中提取纯文本内容,从而避免潜在的样式破坏和安全风险,确保数据以纯净、可控的方式显示。

理解DataTables的默认行为与潜在风险

当使用DataTables展示数据时,如果数据源中包含HTML标签(例如

, ,

等),DataTables默认会将这些标签作为HTML内容进行解析和渲染。这在某些情况下可能是期望的行为,例如需要自定义单元格的样式或结构。然而,在更多情况下,我们可能只希望显示数据中的纯文本内容,而忽略或移除其中的HTML标签。

不加处理地渲染HTML标签可能导致以下问题:

  • 布局混乱: 意外的HTML标签可能破坏表格的整体布局和样式。
  • 样式冲突: 内联样式或不当的标签可能与DataTables或页面本身的CSS产生冲突。
  • 安全漏洞(XSS): 最严重的是,如果数据来源于用户输入且未经过严格净化,恶意用户可能会注入<script>标签或其他恶意HTML代码,导致跨站脚本攻击(XSS),对用户造成危害。</script>

考虑以下示例,其中数据源的name字段包含各种HTML标签:

<html>
    <head>
      <title>DataTables HTML渲染问题</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
      <script src="https://cdn.datatables.net/1.10.1/js/jquery.dataTables.min.js"></script>
    </head>
    <body>
        <table id="example" class="display table table-striped" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Age</th>                
            </tr>
        </thead>        
    </table>

    </body>
        <script>
        $(document).ready(function(){
        var myData = 
 [
    {
      "name": "<p>Jack</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>",
      "age": 29      
    },
    {
      "name": "<b><i>Madame Uppercut</i></b>",
      "age": 39
    },
    {
      "name": "<h4 style='color:red'>Eternal Flame</h4>",
      "age": 45
    }
  ];
            $('#example').DataTable({
                data: myData,
                "columns": [{"data":"name"},{"data":"age"}] // 默认渲染HTML
            });
        });         
        </script>
</html>

上述代码将直接渲染

Jack

立即学习前端免费学习笔记(深入)”;

Madame Uppercut

Eternal Flame

,导致单元格内容以HTML标签的样式呈现。

解决方案核心:columns.render函数

DataTables提供了一个强大的columns.render选项,允许开发者在数据被渲染到单元格之前对其进行自定义处理。这是解决HTML渲染问题的关键。

columns.render是一个函数,它接收以下参数:

  • data: 单元格的原始数据。
  • type: DataTables请求渲染的类型(例如,display用于显示,filter用于过滤,sort用于排序等)。
  • row: 整个行的数据对象。
  • meta: 包含有关单元格、行和列的元信息对象。

通过在render函数中处理data参数,我们可以确保只有纯文本内容被返回并显示在表格中。

安全提取文本:$.parseHTML与innerText

为了从包含HTML的字符串中安全地提取纯文本,我们可以结合使用jQuery的$.parseHTML函数和DOM元素的innerText属性。

  1. $.parseHTML(htmlString): 这个jQuery函数可以将一个HTML字符串解析成一个DOM节点数组。它能够识别并构建出实际的DOM结构,而不是简单地处理字符串。
  2. 包裹元素: 在将数据传递给$.parseHTML之前,建议将其包裹在一个元素中,例如'' + data + ''。这样做有几个好处:
    • 确保有效HTML结构: 即使data字符串本身不包含任何HTML标签,或者只包含部分HTML片段,包裹在中也能保证$.parseHTML总能得到一个有效的、可解析的HTML容器。
    • 统一处理: 无论是纯文本、完整HTML还是HTML片段,都能被一致地处理。
  3. node.innerText: 一旦HTML字符串被$.parseHTML解析成DOM节点,我们可以访问这些节点的innerText属性。innerText属性会返回元素及其所有子元素的可见文本内容,而忽略所有的HTML标签和样式。这正是我们需要的纯文本。

完整示例代码

以下是如何在DataTables中应用上述解决方案的完整示例:

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载
<html>
   <head>
      <title>DataTables阻止HTML渲染</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
      <script src="https://cdn.datatables.net/1.10.1/js/jquery.dataTables.min.js"></script>
   </head>
   <body>
      <table id="example" class="display table table-striped" cellspacing="0" width="100%">
         <thead>
            <tr>
               <th>Name</th>
               <th>Age</th>
            </tr>
         </thead>
      </table>
   </body>
   <script>
   $(document).ready(function() {
     var myData = [{
         "name": "<p>Jack</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>",
         "age": 29
       },
       {
         "name": "<b><i>Madame Uppercut</i></b>",
         "age": 39
       },
       {
         "name": "<h4 style='color:red'>Eternal Flame</h4>",
         "age": 45
       },
       {
         "name": "Normal Name No HTML", // 纯文本数据
         "age": 45
       },
       {
         "name": "Not <b>Normal</b> Name - HTML inside the string", // HTML在字符串中间
         "age": 45
       }
     ];

     $('#example').DataTable({
       data: myData,
       columns: [{
           data: "name",
           render: function(data, type, row, meta) {
             // 确保数据被包裹在<span>中,然后解析为DOM节点
             let node = $.parseHTML( '<span>' + data + '</span>' )[0];
             // 返回节点的纯文本内容
             return node.innerText;
           }
         },
         {
           data: "age"
         }
       ]
     });
   });
   </script>
</html>

在这个示例中,name列的render函数会接收原始的HTML字符串,将其解析为DOM节点,然后提取并返回其innerText,从而在表格中只显示“Jack”、“Madame Uppercut”等纯文本内容。

注意事项与进阶考量

1. HTML格式的完整性

上述$.parseHTML方法假定数据中的HTML是结构良好且有效的。如果HTML字符串是残缺不全或格式错误的,$.parseHTML可能无法正确解析,导致innerText返回非预期结果或错误。在生产环境中,最好确保数据源提供的HTML是符合标准的。

2. HTML注释的处理

如果数据中包含HTML注释(例如),$.parseHTML会将其视为注释节点。当提取innerText时,注释内的文本通常会被忽略。例如,对于字符串" not a comment",innerText将返回" not a comment"。如果整个单元格内容都是注释,则会显示为空白。

3. 脚本标签(<script>)的风险与处理</script>

在数据中包含可执行的JavaScript脚本(如<script>alert("test")</script>)是一个严重的潜在安全风险。强烈建议在数据源层面就对用户输入进行严格净化,绝不允许直接存储和传输可执行脚本。

如果数据中确实出现了脚本标签,有以下几点需要注意:

  • HTML编码: 直接将<script>标签放入JavaScript字符串中会引发语法错误,因为JavaScript字符串不能嵌套<script>标签。为了在数据字符串中表示脚本,需要对其进行HTML编码,例如将<编码为<,>编码为>。<pre class="brush:php;toolbar:false;">// 编码后的脚本字符串示例 &quot;&lt;p&gt;Hello&lt;/p&gt;<script>alert('XSS Attack!');</script>&quot;</pre></script>
  • 引号处理: 如果脚本内容中包含双引号(如alert("test")),并且外部JSON字符串也使用双引号,则需要对内部双引号进行转义或改用单引号。
    // 使用单引号避免冲突
    "<script>alert('test');</script>"
  • $.parseHTML的行为: 即使经过HTML编码,$.parseHTML在解析时,如果遇到合法的<script>标签,<strong>它仍然可能会尝试执行其中的脚本。这意味着仅仅使用$.parseHTML和innerText并不能完全杜绝脚本执行的风险,特别是当type参数不是display时,或者在某些浏览器环境下。</script>

核心警告: 无论采用何种前端处理方式,在数据源头对所有用户输入进行严格的HTML净化和转义是防止XSS攻击的最根本和最重要的措施。 不应依赖前端渲染逻辑来消除恶意脚本的威胁。

4. 快速清理方法:正则表达式

如果需求仅仅是简单地移除所有HTML标签,并且不涉及复杂的HTML结构解析或潜在的脚本执行风险,可以使用正则表达式进行快速清理。DataTables内部在处理某些数据类型(如html类型列的排序)时也采用了类似的方法:

render: function(data, type, row, meta) {
  // 简单地替换所有HTML标签为空字符串
  return data.replace( /<.*?>/g, '' );
}

这个方法会将所有形如的结构替换为空,从而达到移除标签的目的。它的优点是简洁高效,但缺点是:

  • 不解析DOM: 它不理解HTML的语义,可能会误删一些特殊字符或被视为标签的内容。
  • 无法处理实体: 对于HTML实体(如&),它不会进行解码。
  • 安全性较低: 对于恶意构造的HTML(例如不完整标签),其处理可能不如$.parseHTML健壮。

因此,对于要求更高的场景,尤其是涉及用户输入时,$.parseHTML结合innerText是更推荐且更安全的方法。

总结

在DataTables中防止HTML标签被意外渲染,主要通过利用columns.render函数实现。结合jQuery的$.parseHTML方法和DOM元素的innerText属性,可以从包含HTML的数据中安全地提取纯文本内容,从而确保表格数据的整洁性和安全性。同时,务必牢记在数据源头进行严格的数据净化和转义,这是防范XSS等安全威胁的根本保障。在简单场景下,正则表达式提供了一个快速移除标签的方案,但其健壮性不如基于DOM解析的方法。选择哪种方法取决于具体的业务需求、数据特性以及对安全性的考量。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

515

2023.12.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号