您的位置:首页 > 理论基础 > 计算机网络

网络安全:常见攻击手段及防御

2019-07-19 17:42 357 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41866772/article/details/96483726

随着互联网的发展,网络安全日益显的尤为重要,接下来介绍一下常见的web攻击手段。

1.XSS攻击(Cross Site Scripting) 全称跨站脚本攻击 

是一种常见的攻击手段之一,攻击者主要通过嵌入恶意脚本程序,当用户打开网页时,脚本程序便在客户端的浏览器中执行,以盗取客户端cookie,用户名密码,下载执行病毒木马程序等。

例:某网站页面有个表单,表单名称为nick,用来向服务器提交昵称信息。value值是用户输入的昵称,比如你吃菜我喝汤,这是正常输入情况,如下:

[code]<input type="text" name="nick" value="你吃菜我喝汤">

可是当用户输入的不是正常的字符串,而是脚本程序 如

[code]"/><script>alert("你是煞笔")</script><!-"

这个表单就变成了:

[code]<input type="text" name="nick" value=" "/><script>alert("你是煞笔")</script><!-" ">

这个时候input后面是不是多了一个script脚本程序,这个脚本程序弹出一个消息框,内容是"你是煞笔",当然这个示例的危害并不大,攻击的危害大小取决于用户植入的脚本。

防御手段:

     分析:XSS之所以能够发生,通过上诉示例中可以看出,用户通过输入代码完成攻击。以html为例,里面包含了大量的”尖括号“,”单引号“,”引号“之类的特殊字符。

   方案:通过上诉分析,我们可以对用户输入的数据进行html转译处理来进行防御。

< &lt;
> &gt;
' &amp;
" &quot;

                                                                                     HTML字符转译

如今又很多框架自身提供了转译功能,比如jstl,不需要开发人员进行二次开发

例:使用jstl转译

[code]<c:out  value="${nick}"  escapeXml="true"></c:out>

只需要将escapeXml设置为true 就可以将变量nick的值进行转译输出。

2.CSRF攻击(Cross  Site Request forgery) 全称跨站请求伪造

攻击者盗用你在某网站的身份如cookie,以你的名义向该网站发送恶意请求。这个就比较可怕了,能够利用你的身份发邮件,发短信,甚至转账,盗取账号等。

原理图:

首先用户C访问站点A,然后通过信息验证完成登陆,此时产生cookie值保存在浏览器中,然后用户C在没有退出该网站的情况下,无意中访问了恶意的站点B,此时站点B的某个页面带着站点A的cookie 向站点A 发恶意请求,站点A根据请求所带的cookie,判断此请求为用户发送的,因此处理请求  从而完成欺骗。

用户C只需做两件事,CSRF攻击就发生了。

1.登陆某个网站没有退出。

2.   在没有退出的情况下(退出时,session会话结束cookie失效) 访问了其他的网站(恶意网站)

有时候所谓的恶意网站,很可能是一个有XSS漏洞的网站

防御手段:

(1)将cookie设置为HttpOnly

CSRF攻击很大程度上是利用浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie中设置"HttpOnly"属性,这样就无法读取到cookie,避免了攻击者伪造cookie的情况出现。

在java的servlet的API中设置的代码如下:

[code]response.setHeader("Set_Cookie","cookiename=cookievalue;HttpOnly");

(2)增加token

攻击者通过盗取cookie来完成安全验证,如果在请求中放入攻击者不能伪造的信息,该信息不在cookie中。

因此可以在htpp请求中加入参数token,并在服务端(可在拦截器中校验:session中的token与请求中的token是否一致)校验token,如果token不存在或者存在但不正确,则拒绝请求。

页面:

假设请求通过post方式提交,则可以在相应的表单中增加一个隐藏域:

[code]<input type="hidden" name="_token" value=""/>

服务端:

token值在服务端生成,每次会话可以使用相同的token,会话过期token失效,攻击者无法获取token,也就无法伪造请求。

在session中添加token:

[code]HttpSession session = request.getSession();
Object token = session.getAttribute("_token");
if(token==null || "".equals(token)){
session.setAttribute("_tonken",UUID.randomUUID().toString());
}

(3)通过Referer识别

Http协议中,http头部有一个字段Referer,它记录了http请求的地址。CSRF通过其他网站发送伪造请求进行攻击,因此 可以通过校验该地址是否是该网站发出即可。

获取Http请求Referer:

[code]String referer = request.getHeader("Referer");

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: