稀里糊涂的转义

2023-10-16 11:15
文章标签 转义 稀里糊涂

本文主要是介绍稀里糊涂的转义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

前段时间挖机ERP系统出现一个问题,表单录入客户名称是 L & Q International Trading Limited,然后页面展示变成 L & Q International Trading Limited,即字符 &变成了&。

二、为什么要转义

&amp;是&在HTML中的转义,那为什么要进行转义呢,因为在HTML中有些字符是预留的(注:每种语言都有预留关键字),比如在HTML中不能直接使用小于号(<)、大于号(>)等,因为浏览器会认为它们是HTML标签,如果希望正确显示预留字符,我们必须在HTML代码中使用对应的字符实体。

注:上面这段话不一定对,估计以前浏览器是存在这个问题,现在浏览器可能兼容性做得比较完善,我测试了一下是能够直接用 < 输出的,但空格是不行,你输入多个空格页面显示时会截取掉只留下一个空格。

&其实并不是HTHL标签中的关键字,但&gt;&lt;这些用到它,所以它也必须进行转义。

三、问题排查

1、确认&amp;是在前端还是后端造成的

开始是怀疑前端代码做了处理,直接用postman提交发现在后端接收到的数据也会变成了 &amp;这就排除掉前端的问题,前端Get提交的数据可能会做URLEncode,但要搞清楚URLEncode编码和HTML标签转义是两回事,POST过来JSON数据一般理论上是不会被改变。

结论:后端问题

2、确认后端哪个环节的问题

怀疑后端程序基础框架中有代码进行转义,直接创建一个最简单的SpringBoot项目(与工程版本一致),用postman提交含&的字符串,后端接收到的数据是正常的,这说明与SpringBoot框架不相关。

结论:后端拦截器问题。

3、后端拦截器代码跟踪

发现工程中引入了XssFilter,会对HTML标签转义,对脚本进行删除等。

这样被过转义后,存入数据库的就是  L &amp; Q International Trading Limited。

4、前端展示

Vue页面上使用双花括号 {{ }}、或Element-UI 的 el-table会将HTML(含转义后的实体)转换为纯文本进行输出。所以就造成了这个问题。

5、解决方案

如果明确了后端使用了XssFilter进行了过滤(会删除掉脚本),前端vue可以直接使用 v-html来显示 ,这样就不会有&amp;,但el-table中又该如何处理呢(好像只能和solt去处理了)?其实我看了代码,发现我们业务类中加了以下代码。

req.setName(StringEscapeUtils.unescapeHtml4(req.getName()));

这个是能保证页面上不再出现&amp;但这样做XssFilter的意义在哪里呢?

注:一般ERP这种ToB的项目需要内部账号登录才能使用,其实没有什么必要做XSS安全校验

这篇关于稀里糊涂的转义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220142

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

正则 re中要转义的特殊字符

如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。需要转义  特别字符 说明 $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n' 或 ‘\r'。要匹配 $ 字符本身,请使用 \$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用

对不受信任的数据进行编码和转义以防止注入攻击

根据 OWASP 进行编码和注入 来自有关此控件的 OWASP 文档: 编码和转义是旨在阻止注入攻击的防御技术。 直到2017 年,OWASP 的十大风险列表才将跨站点脚本 (XSS) 与“注入”分开列出。很多人(包括我自己)认为 XSS 是一种注入形式。因此,从这个角度来看,说输出编码可以防止注入攻击是准确的。 注入攻击、编码和解释器 转义和编码有什么区别? 在本文中,我将大量

ORACLE接口http传输时中文转义 url_encode

url_encode。 CREATE OR REPLACE FUNCTION url_encode(urlEncode IN VARCHAR2)RETURN VARCHAR2 ASBEGIN--utl_url.escape()该方法只能在函数中调用RETURN utl_url.escape(urlEncode, TRUE, 'utf-8');END; DECLAREl_url VARCH

Django 模版转义

1,模版转义的作用 Django模版系统默认会自动转义所有变量。这意味着,如果你在模版中输出一个变量,它的内容会被转义,以防止跨站脚本攻击(XSS)。例如,如果你的变量包含HTML标签,这些标签会被转义,而不是被浏览器解释。 2,添加函数视图 Test/app5/views.py from django.shortcuts import render# Create your view

Python json.dumps()添加转义符号

文章目录 问题描述解决方案参考文献 问题描述 输入 [{'a': '1'}, {'b': '2'}] 输出 [{\"a\":\"1\"}, {\"b\":\"2\"}] 解决方案 import jsondata = [{'a': '1'}, {'b': '2'}]json_with_escape = json.dumps(data).replace("\\",

JSON 常量详情参考 (内含对中文不转义的参数)

JSON_ERROR_NONE (integer)没有错误发生。自 PHP 5.3.0 起生效。JSON_ERROR_DEPTH (integer)到达了最大堆栈深度。自 PHP 5.3.0 起生效。JSON_ERROR_STATE_MISMATCH (integer)出现了下溢(underflow)或者模式不匹配。自 PHP 5.3.0 起生效。JSON_ERROR_CTRL_CH

关于 JSTL c:out 对 XML html 自动转义 转义的禁用

在servlet里设置了属性值 request.setAttribute("MENU", menu);   doPost()或者doGet()里做跳转:   代码 getServletConfig().getServletContext().getRequestDispatcher(      mainpage).forward(request, response);   在mai

flask返回的数据怎么是转义后的字符串啊

Flask在返回JSON数据时,默认情况下会对特殊字符进行转义,以确保数据能安全地在HTML页面中展示,避免XSS(跨站脚本攻击)等安全问题。如果不希望Flask对JSON响应中的字符串自动转义,通常是因为你希望在前端直接使用这些数据(例如作为JavaScript的一部分),那么需要确保数据是以正确的格式传输的。Flask使用jsonify函数来创建JSON响应,它内部使用了json模块来序列化数

html页面转义

&apos;     ----单引号 $#39;        ----单引号(兼容IE) &quot;      -----双引号 &amp;        ----& &quot;        ----" &lt;              ----< &gt;             ----> &nbsp;        ----空格