解决layui的table组件data-content未转义导致的注入问题。

Layui表格动态渲染状态按钮:从templet函数到事件绑定的完整实现 在前端开发中,数据表格的动态渲染与交互是提升后台管理系统操作效率的关键。其核心原理在于,前端框架通过数据绑定与模板引擎,将后端返回的JSON数据转化为用户可直观操作的DOM元素。这一技术价值在于实现了数据与视图的分离,开发者只需关注数据状态的变化,视图便能自动、高效地更新。在诸如用户管理、订单处理等涉及状态切换的应用场景中,动态渲染操作按钮(如启用/禁用)尤为常见。本文聚焦于Layui这一经典前端框架,深入探讨如何利用其`templet`自定义模板函数,根据行数据状态(如status字段为1或0)动态生成不 阅读详情

本文更新不及时,建议到原文地址浏览:解决layui的table组件data-content未转义导致的注入问题。

layui是一套非常不错的后台管理系统UI框架,其简约并具有系统感的设计赢得了许多开发者的青睐。不过我在使用layui的动态表格组件时遇到了一个问题,当数据中存在未转义的数据时,表格在渲染时会备份一个数据在dom属性上,而此数据未进行html转义导致存在注入攻击问题。我通过源码阅读,了解到了为什么此问题的原因,并完美修复这个问题。下面将进行详细介绍。

一、问题重现

并不是所有情况都会有这个问题,只有当你在为某一个字段设置了templet模板。不管是一个方法,还是一个模板语法,layui才会在此单元表格上新增一个data-content属性。而此时,如果你的数据又恰巧包含了html能解析的内容,比如:当你有一份形如下面的数据要显示到table组件里面时,由于未对data-content属性进行转义赋值,导致你的页面可能与预期展示不一样:

var data = [
    {id: 1, name: "Tom\"> <b οnclick=\"alert(66)\">呵呵</b>"},
    {id: 2, name: "Bob\"> <b οnclick=\"alert('你完了')\">完蛋了</b>"}
];

把这份数据通过设定templet渲染到table组件。得到下面的效果:

{"class":"useDialog"}

不仅仅是被攻击者达到了意图,而且点击它们还会弹出提示信息。再来看一看dom结构被这个数据搞成了什么样:

{"class":"useDialog"}

可以看到,由于data-content没有转义,导致界面dom结构凌乱,并且丢失了前端正常的功能。标记1处就是因为没有转义,数据里的html被应用到了dom结构里,尽管我们在templet里进行了转义使得标记2正常显示数据,但依然没能让data-content进行转义。而如果这是一个十分恶意的攻击,那么这个网站应该在这里就被攻破了。我们当然不能允许这样的事情发生。毕竟要恰饭的。

二、修复问题

修复问题的办法有好几种或者更多,这里推荐几个比较简单的解决方案。

1、后端修复

后端在数据库中将数据查询出来后,就对有些敏感字段先进行一下html转义,让前端接收到的数据已经是一个无需担心注入的安全字符串。那么这样就可以放心使用了。要在后端进行转义,下面提供一个示例代码:

String badStr = "<script>alert(66)</script>"
// 使用 Spring 提供的转换工具
String safeStr = HtmlUtils.htmlEscape(badStr);

// 现在,就可以放心的使用 safeStr 传递给前端了。
2、前端修改table组件代码

如果后端代码被多处使用,而有些"端"并不需要转换,只针对部分“端”才需要,那如果后端修复不是很方便的话,前端就不得不自行修复了。在前面也了解到,即便我们在templet里面使用了转义输出,也依然阻止不了data-content的发生。看来data-content的赋值是我们控制不了的了。

所以,不妨直接打开table组件代码,搜索data-content字段,直接定位这个赋值代码。下面代码截取自layui项目table组件[提交版本号5904e5b1344efa661b53f1cbd2a5d0e5b12ea4ef]的部分代码:

that.eachCols(function(i3, item3){
  var field = item3.field || i3
  ,key = options.index + '-' + item3.key
  ,content = item1[field];

  if(content === undefined || content === null) content = '';
  if(item3.colGroup) return;

  //td内容
  var td = ['<td data-field="'+ field +'" data-key="'+ key +'" '+ function(){ //追加各种属性
    var attr = [];
    if(item3.edit) attr.push('data-edit="'+ item3.edit +'"'); //是否允许单元格编辑
    if(item3.align) attr.push('align="'+ item3.align +'"'); //对齐方式
    if(item3.templet) attr.push('data-content="'+ content +'"'); //自定义模板
    if(item3.toolbar) attr.push('data-off="true"'); //行工具列关闭单元格事件
    if(item3.event) attr.push('lay-event="'+ item3.event +'"'); //自定义事件
    if(item3.style) attr.push('style="'+ item3.style +'"'); //自定义样式
    if(item3.minWidth) attr.push('data-minwidth="'+ item3.minWidth +'"'); //单元格最小宽度
    return attr.join(' ');
  }() +' class="'+ function(){ //追加样式

上述代码中,第14行代码处可以看到,这里直接对data-content进行赋值,完全没有进行转义的行为。所以,我们现在只需要加上转义的代码就好了:

// 原来的代码
if(item3.templet) attr.push('data-content="'+ content +'"'); //自定义模板

// 修改为:
if(item3.templet) attr.push('data-content="'+ laytpl("{{=d.t}}").render({t:content}) +'"'); //自定义模板

可以看到,上述代码中,借助了laytpl模板引擎,非常方便的就实现了数据转义后赋值到data-content里面,这样,就不会再出现注入攻击了。修改后,我们看看现在的效果以及dom结构:

{"class":"useDialog"}

现在不论是界面显示,还是dom结构,都已经显示正常。data-content也进行了转义显示,没有任何问题。

三、注意

上述在前端修复的方案,其修改的代码是layui的源代码,并非你下载的layui代码,但你可以修改好后,将修改好了的table组件代码覆盖到你下载的layui对应的组件,也可以有效果。你也可以直接修改下载的源代码。不过下载的代码是经过编译缩小的,所有字段都变成了单个字母不便于识别,修改时要小心,找准位置和代码,使用同样的方式进行修复,不过要注意,这时laytpl可能就是另一个字母变量了。

DBeaver 26安装配置全指南:JDK适配、驱动管理与UI渲染避坑 DBeaver作为跨数据库通用客户端,其核心能力依赖Java运行环境、JDBC驱动机制与图形渲染引擎三者的协同。理解JDK版本兼容性(如JDK 11+强制要求)、驱动加载原理(Maven坐标自动解析 vs 离线jar管理)及UI渲染变迁(SWT→LayUI 2.0带来的字体/缩放/高亮重置),是保障稳定连接MySQL、Oracle、OceanBase、GaussDB等多源数据库的技术前提。本文聚焦DBeaver 26版本升级带来的底层变化,详解JDK绑定验证、国产数据库驱动签名绕过、HiDPI适配与CSS定 阅读详情

相关推荐

前端面试题汇总

总结了一下之前面试遇到的问题,方便自己也方便他人

annier_11的博客 151

Layui Table请求参数全方位控制指南:从基础到高级实战

在Web前端开发中,数据表格组件是后台管理系统和复杂数据展示页面的核心。其核心原理在于通过AJAX请求与后端API进行数据交互,实现动态渲染、分页、排序和筛选。掌握表格组件的请求参数控制技术,对于构建高效、可维护的数据驱动型应用具有重要价值,尤其在需要处理复杂查询条件、多表头排序或特殊参数格式的业务场景中。本文聚焦于Layui框架的Table组件,深入解析其请求生命周期与参数合并策略,并针对【where对象】和【beforeSend回调】等关键机制,提供集成外部表单、实现服务端多列组合排序、动态修改请求方法

weixin_30457465的博客 398

Nginx架构及配置详解

概述 Nginx采用C进行编写,是俄罗斯程序员开发的一款轻量级的可构建Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器的软件, Nginx服务器是一个高性能的HTTP和反向代理web服务器,同时也可提供了IMAP/POP3/SMTP服务。nginx常用作跑静态和做负载反向代理,动态php交给apache处理,因后者比较稳定,jsp交给tomcat、resin或jboss。n......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 7071

BootStarp4(3)

Bootstrap4 模态框 模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗 体可提供信息交互等。 可以通过添加 .modal-sm 类来创建一个小模态框,.modal-lg 类可以创建一个大模态框。 尺寸类放在 <div>元素的 .modal-dialog 类后 Bootstrap4 提示框 提示框是一个小小的弹窗,在鼠标移动到元素上显示,鼠标移到元素外就消失。 ...

m0_55689351的博客 783

无需UMAT:基于Abaqus内置模型实现形状记忆聚合物结构的热-力耦合仿真

本文详细介绍了如何利用Abaqus内置模型实现形状记忆聚合物(SMP)的热-力耦合仿真,无需编写复杂的UMAT子程序。通过广义Maxwell模型和Neo-Hookean模型的组合应用,结合完整的热-力耦合分析流程,帮助工程师高效模拟SMP的形状记忆行为。文章还提供了工程应用案例和常见问题解决方案,为相关领域的研究和设计提供实用指导。

weixin_34005090的博客 117

FFT中的精度博弈:定点数缩放、块浮点与溢出处理在Vivado IP核中的实践权衡

本文探讨了在Vivado FFT IP核中实现高精度快速傅里叶变换的关键技术,包括定点数缩放策略、块浮点模式及溢出处理机制。通过分析不同精度控制方案的资源开销与性能权衡,为工程师在医疗成像、雷达信号处理等高动态范围应用中优化FFT实现提供实践指导。

melon的博客 1097

解决layui的table组件data-content未转义导致的问题。

几番修改无效因为data-content为layui自己的内容,所以需要修改源代码处理 参考https://blog.youkuaiyun.com/MicroAnswer/article/details/103008164 需要修改 table.js 的源代码 layui-v2.5.6版本 将 r.templet && e.push('data-content="' + m + ...

Sun的专栏 1328

cmw500 lte非信令测试_WiFi信令测试在研发过程中的作用

  1、关于信令测试的故事  2016年的某天,某著名网络产品公司技术负责人致电寻求技术支持:我们的无线路由器遇到了一个困惑:我们某款路由器应用于实际WiFi网络中时,WiFi终端接入非常困难。但是我们使用测试工具检测此路由器,它的所有物理射频指标都非常优异。不知道是为什么?  我来到了测试现场看到:WiFi路由器受控于芯片公司的测试工具,其WiFi发射机指标在非信令测试仪上显示:无论功率、EVM...

weixin_39662263的博客 3925

data-content 的内容移动设备不显示

上述代码中,我们首先使用 `document.querySelectorAll()` 方法获取所有需要悬停的元素,在 PC 端上监听 `mouseenter`、 `mouseleave` 事件,在移动端上监听 `touchstart`、`touchend` 事件,通过设置 `data-content` 和 `title` 属性控制元素的显示和隐藏。移动设备在触摸元素时默认会弹出一个选中框,所以 `data-content` 内容在移动设备上默认无法显示。

cxh20777的专栏 409

基于ARDUINIO的5路红外循迹小车

基于ARDUINIO的5路红外循迹小车 新手抄袭了很多大神的代码。这里表示感谢。 #define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define STURNLEFT 3 #define STURNRIGHT 4 #define TURNLEFT 5 #define TURNRIGHT 6 #define TURNRIGHT90 7 #define TURNLEFT90 8 int leftA_PIN = A0; int

weixin_48214416的博客 4381

QGIS中高效处理CAD数据的两种实用技巧

本文详细解析了在QGIS中高效处理CAD数据的两种核心方法。针对DWG/DXF文件在QGIS中直接打开失败的问题,介绍了使用QGIS内置数据导入管理器进行标准化转换的流程,并重点推荐了功能更强大的Another DXF Importer插件,以更好地保留文字、块属性等复杂信息。文章对比了两种方法的优劣与适用场景,并提供了坐标系设置、中文乱码等常见问题的避坑指南,帮助用户根据数据需求选择最佳导入策略。

weixin_28363123的博客 117

Vue 在 CSS 中使用 data 中定义的数据

在 `CSS` 中使用 `data` 中定义的数据

broken_promise的博客 6417

Circos图审美拯救计划:用TBtools复刻Nature级共线性分析图谱

本文针对Circos图在共线性分析中的审美提升问题,提供了一套基于TBtools的完整优化方案。通过构建和谐的色彩体系、精细控制信息层布局以及模仿顶刊构图逻辑,详细讲解了如何从配色、透明度、标签显示到高级参数设置,将默认图表升级为具有高级学术美感的Nature级图谱,助力研究者提升论文图表质量。

cherry的博客 911

js用append方法追加bootstrap中popover的data-content内容时样式不显示的解决办法

今天做一个小功能时,想用bootstrap的popover弹出框做如下效果: 我 很乖地按照教程敲下代码 +"&lt;button class='btn btn-warning' title='"+data.result[i].student_name+"的其他信息'" +" data-content='&lt;ul&gt;&lt;li&gt;出生日期:"+timeStamp2Date(...

腾腾不是个好人的博客 7146

T100批处理作业开发

g_bgjob = ‘Y’ 后台执行g_bgjob = ‘N’ 前台执行。

weixin_43400895的博客 585

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

Layui Table请求参数全解析:从静态配置到动态交互与性能优化

在Web前端开发中,数据表格组件是后台管理系统不可或缺的核心模块,其与后端的高效数据通信直接关系到用户体验和系统性能。理解数据表格的请求参数机制,本质上是掌握前后端数据交互的原理,这有助于开发者精准控制数据流动,灵活适配多样化的接口规范。从技术实现层面看,这通常涉及静态查询条件配置、分页参数自动管理、请求响应字段映射等基础概念。这些技术的价值在于,它们将通用的数据请求模式抽象为可配置的组件行为,极大地提升了开发效率。在实际应用场景中,尤其是在Layui框架构建的管理系统中,开发者常需处理动态搜索条件传递、分

weixin_30256901的博客 353

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何给MySQL在线迁移限流?gh-ost的Throttle机制与--max-lag-millis深度解析

**gh-ost** 是 GitHub 开源的 MySQL 在线结构迁移工具(Online Schema-migration Tool),它在不停机的情况下完成大表的 `ALTER` 操作。而真正让它"对生产友好"的,正是内置的 **Throttle(限流)机制**——当从库延迟、主库负载或外部信号超过阈值时,gh-ost 会主动暂停数据拷贝,直到条件恢复。这篇文章带你从零理解 gh-ost 的限

gitblog_00961的博客 345

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

AI编排实战:MuleSoft+LangChain企业级智能集成架构

AI编排(AI Orchestration)是打通企业多源异构系统与大模型能力的关键工程范式,其核心在于构建确定性数据管道与非确定性智能推理的协同机制。它源于对ERP、CRM、数据库等传统系统与GPT、Llama等大模型之间语义鸿沟的系统性解决,技术价值体现在安全可控的数据调度、可审计的AI决策链路及低延迟的业务响应。典型应用场景包括销售风险预警、智能挽留邮件生成、跨系统客户画像聚合等。本文聚焦MuleSoft与LangChain双引擎协同设计,深入解析如何通过职责分离实现企业级可靠性与LLM智能的有机融合

weixin_33717117的博客 1538

SpringBoot药店管理系统实战:从零搭建Java毕设项目

SpringBoot作为Java领域主流的微服务框架,通过自动配置和约定大于配置的理念,极大地简化了企业级应用的开发与部署流程。其核心原理在于内嵌Web服务器和Starter依赖机制,使开发者能快速构建出高内聚、低耦合的RESTful API服务。在技术价值上,SpringBoot提升了开发效率,降低了项目维护成本,尤其适合快速构建如药店管理系统这类涉及多模块、多表关联的业务系统。在应用场景中,结合MyBatis-Plus进行数据持久化操作,可以高效实现药品信息管理、库存与销售联动等核心业务逻辑。本文以药店

weixin_33769125的博客 382

Jamba混合架构实战:用Mamba+Transformer简化长文本处理

长文本处理是企业AI落地的核心瓶颈,传统方案依赖RAG流水线、向量数据库和复杂预处理,导致高成本与低鲁棒性。其技术本质在于上下文建模效率与推理能力的平衡——Mamba(SSM)提供O(N)线性状态更新,高效捕获长程依赖;Transformer保障符号推理与逻辑泛化。Jamba将二者分层融合,既规避了纯Mamba在金融/法律多步推理中的准确率短板,又突破了纯Transformer的显存与延迟瓶颈。该架构直接支持PDF直读、原生工具调用与JSON结构化输出,适用于合同审查、财报分析、合规审计等强结构化文档场景,

weixin_30932215的博客 431

(课程设计)springboot大学生创新创业管理-毕业设计 附源码041557

用户模块: 账号注册。 账号登录认证。 管理个人资料信息,修改可修改的信息项。 项目申报查询,同时查看历史已申报的记录。 搜索文件资源,并下载到本地。 管理员模块: 对学生留下的评论数据进行维护,删除违规评论。 对学生留下的留言数据进行维护,删除违规留言,可对其回复想要的留言。 对论坛进行维护,新增讨论版块,维护已存在的帖子,删除违规帖子等。 负责维护文件资源,上传文件资源,删除已过期文件。 负责维护视频资源,上传视频资源,删除已过期视频。 维护学生,审核学生的账号,可以冻结学生的登录权限,或者删除学生账号

ID3461074420的博客 2303

(附源码)spring boot智能停车场系统-毕业设计 课程设计 065415

本设计主要实现集人性化、高效率、便捷等优点于一身的智能停车场管理系统,完成首页、站点管理(轮播图、公告栏)用户管理(管理员、普通用户)内容管理(汽车资讯、资讯分类)更多管理(车位信息、停车信息、出库信息信息、IC卡信息)等功能模块。 智能停车场管理系统使用Java语言,采用基于 MVVM模式的springboot框架进行开发,使用 Eclipse 2017 CI 10 编译器编写,数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介,配合前台HTML+CSS 技术完成系统的开发。

Q_3461074420的博客 2984

基于SSM框架的超市会员进销存管理系统设计与实现

在Java企业级应用开发中,SSM(Spring、Spring MVC、MyBatis)框架组合因其成熟稳定、易于上手而成为经典选择。其核心原理在于Spring的IoC容器管理对象依赖,Spring MVC处理Web请求分发,MyBatis则负责数据库的灵活映射与操作,共同构建了清晰的分层架构。这种架构的价值在于实现了高内聚、低耦合,极大地提升了代码的可维护性和可测试性。在诸如电商、ERP、CRM等需要处理复杂业务逻辑和数据持久化的应用场景中,SSM框架能够高效地支撑会员管理、商品库存、订单交易等核心模块的

weixin_30460489的博客 396

SSM框架实战:从零部署机床配件物流管理系统毕业设计项目

在Java企业级开发领域,SSM(Spring、Spring MVC、MyBatis)框架整合是构建Web应用的核心技术栈。其原理是通过Spring的IoC容器管理对象依赖,Spring MVC处理Web请求与响应,MyBatis实现对象与数据库的映射,共同构建出分层清晰、易于维护的应用程序。这套经典组合的技术价值在于其成熟稳定、学习资源丰富,是理解MVC设计模式和ORM思想的绝佳实践。在应用场景上,它广泛用于各类后台管理系统,如电商、ERP以及本文聚焦的物流管理系统。本文将以一个典型的机床配件物流管理项目

weixin_30619101的博客 434

【课程设计】springboot零接触校园快递管理系统 毕业设计 654153

普通用户模块: 账号注册。 账号登录认证。 管理个人资料信息,修改可修改的信息项。 快递查询,同时查看历史已取件快递的记录。 申请管理,可修改快递信息。 快递取件,同时查看历史已取件的记录。 管理员模块: 维护普通用户,审核普通用户的账号,可以冻结普通用户的登录权限,或者删除普通用户账号。 发布快递,并可以销毁某个快递,更新快递数据,模糊搜索快递数据等。 管理快递取件通知数据。 维护快递取件数据。 查看普通用户提交的申请管理数据,管理员有权利维护它。

WeiXin_DZbishe的博客 3130
上一篇: Access-Control-Allow-Origin跨域解决及详细介绍
下一篇: 【Vue,微信】单页应用到底该用hash模式还是history模式
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值