mui做wap网站,网站营销seo,html手机网站,软文投放平台有哪些?一、前言
前段时间挖机ERP系统出现一个问题#xff0c;表单录入客户名称是 L Q International Trading Limited#xff0c;然后页面展示变成 L amp; Q International Trading Limited#xff0c;即字符 变成了amp#xff1b;。
二、为什么要转义
表单录入客户名称是 L Q International Trading Limited然后页面展示变成 L amp; Q International Trading Limited即字符 变成了amp。
二、为什么要转义
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安全校验