0


幕课在线办公项目笔记——day2

抵御XSS攻击

1、xss攻击的危害

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,Activex,Flash或者甚至是普通的HTML,攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

例如用户在发帖或者注册的时候,在文本框中输入,这段代码如果不经过转义处理,而直接保存到数据库。将来视图层渲染HTML的时候,把这段代码输出到页面上,那么

通常情况下,我们登陆到某个网站。如果网站使用HttpSession保存登陆凭证,那么SessionId会以Cookie的形式保存在浏览器上。如果黑客在这个网页发帖的时候,填写的Javascript代码是用来获取cookie内容的,并且把cookie内容通过Ajax发送给黑客自己的电脑。于是只要有人在这个网站上浏览黑客发的帖子,那么视图层渲染HTML页面,就会执行注入的XSS脚本,于是你的Cookie信息就泄露了。黑客在自己的电脑上构建出Cookie,就可以冒充已经登陆的用户。

即便很多网站使用了JWT,登陆凭证(Token令牌)是存储在浏览器上面的。所以用XSS脚本可以轻松的从Storage中提取出Token,黑客依然可以轻松的冒充已经登陆的用户。

所以避免XSS攻击最有效的办法就是对用户输入的数据进行转义,然后存储到数据库里面。等到视图层渲染HTML页面的时候。转义后的文字是不会被当做JavaScript执行的,这就可以抵御XSS攻击。

2、导入依赖库

因为Hutpol工具包带有XSS转义的工具类,所以我们要导入Hutool,然后利用Servlet规范提供的请求包装类,定义数据转义功能。

<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.4.0</version>
 </dependency>

3、定义请求包装类

我们平时写Web项目遇到的 HttpServletRequest,它其实是个接口。如果我们想要重新定义请求类,扩展这个接口是最不应该的。因为HttpServletRequest接口中抽象方法太多了,我们逐一实现起来太耗费时间。所以我们应该挑选一个简单一点的自定义请求类的方式。那就是继承HttpservletRequestwrapper父类。

JavaEER是一个标准,具体的实现由各家应用服务器厂商来完成。比如说Tomcat在实现Servlet规范的时候,就自定义了HttpServletRequest接口的实现类。同时JavaEE规范还定义了ttpServletRequestwrapper,这个类是请求类的包装类,用上了装饰器模式。不得不说这里用到的设计模式真的非常棒,无论各家应用服务器厂商怎么去实现HttpServletRequest接口,用户想要自定义请求,只需要继承HttpServletRequestwrapper,对应覆盖某个方法即可,然后把请求传入请求包装类,装饰器模式就会替代请求对象中对应的某个方法。用户的代码和服务器厂商的代码完全解耦,我们不用关心HttpServletRequest接口是怎么实现的,借助于包装类我们可以随意修改请求中的方法。

publicclassXssHttpServletRequestWrapperextendsHttpServletRequestWrapper{publicXssHttpServletRequestWrapper(HttpServletRequest request){super(request);}@OverridepublicStringgetParameter(String name){String value=super.getParameter(name);if(!StrUtil.hasEmpty(value)){
            value=HtmlUtil.filter(value);}return value;}@OverridepublicString[]getParameterValues(String name){String[] values=super.getParameterValues(name);if(values!=null){for(int i=0;i<values.length;i++){String value=values[i];if(!StrUtil.hasEmpty(value)){
                    value=HtmlUtil.filter(value);}
                values[i]=value;}}return values;}@OverridepublicMap<String,String[]>getParameterMap(){Map<String,String[]> parameters =super.getParameterMap();//这里使用LinkedHashMap来保证元素保持原来的顺序LinkedHashMap<String,String[]> map=newLinkedHashMap();if(parameters!=null){for(String key:parameters.keySet()){String[] values=parameters.get(key);for(int i =0; i < values.length; i++){String value = values[i];if(!StrUtil.hasEmpty(value)){
                        value =HtmlUtil.filter(value);}
                    values[i]= value;}
                map.put(key,values);}}return map;}@OverridepublicStringgetHeader(String name){String value=super.getHeader(name);if(!StrUtil.hasEmpty(value)){
            value =HtmlUtil.filter(value);}return value;}}
标签: 安全 xss

本文转载自: https://blog.csdn.net/weixin_65349299/article/details/122226761
版权归原作者 一定会去到彩虹海的麦当 所有, 如有侵权,请联系我们删除。

“幕课在线办公项目笔记&mdash;&mdash;day2”的评论:

还没有评论