安全防范知识点(XSS、CSRF、点击劫持、中间人攻击)

什么是XSS攻击?如何防范XSS攻击?什么是CSP?
XSS跨站脚本攻击是一种网站应用程序的安全泄露攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在查看网页的时候就会收到影响。
XSS简单来说,就是攻击者想尽一切办法可以执行的代码注入到网页中。
XSS可以分为多种类型,但是总体上分为两类:持久型和非持久型。
持久型也就是攻击的代码被服务端写入数据库中,这种攻击危害性很大,因为如果网站访问量很大的话,就会到导致大量正常访问页面的用户都受到攻击。
举个例子,对于评论功能来说,就是防范持久型XSS攻击,因为我可以在评论中输入以下内容
在这里插入图片描述
这种情况如果前后端没有做好防御的话,这段话就会被存储到数据库中,这样每个打开该页面的用户都会被攻击到。
非持久型相比于前者危害就小的多了,一般通过修改URL参数的方式加入攻击代码,诱导用户访问连接从而进行攻击。
举个例子,如果页面需要从URL中获取某些参数作为内容的话,不经过过滤就会导致攻击代码被执行

<!--http://www.domain.com?name=<script>alert(1)</script>-->
<div></div>

但是对于这种攻击方式来说,如果用户使用Chrome这类浏览器的话,浏览器就能自动帮助用户防御攻击,但是我们不能因此就不防御此类攻击了,因为我不能确保用户都使用了该类浏览器。
对于XSS攻击来说,通常由两种方式可以用来防御:
转移字符:首先,对于用户的输入应该是永远不信任的,最普遍的做法就是转移输入输出的内容,对于引号、尖括号、斜杠进行转义。

function escape(str){
	str=str.replace(/&/g,'&');
	str=str.replace(/,'<');
	str=str.replace(/>/g,'>');
	str=str.replace(/"/g,'&quto;');
	str=str.replace(/'/g,''');
	str=str.replace(/\//g,'/');
}

通过转义可以将攻代码变成

// -> <script>alert(1)</script>
escape('')

但是对于现实富文本来说,显然不能通过上面的办法转移所有的字符,因为这样会把需要的格式页过滤掉。对于这种情况,通常采用白名单过滤的方式,当然也可以通过黑明点过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。

const xss=require('xss');
let html=xss('

XSS Demo

'
); // ->

XSS Demo

<script>alert("xss");</script>
console.log(html);

以上示例使用了js-xss来说实现,可以看到在输出中保留h1标签且过滤了script标签。
使用cookie的httpOnly属性,加上这个属性的cookie字段,js是无法进行读写的
避免使用eval、new Function等执行字符串的方法,除非确定字符串与用户输入无关
CSP
CSP本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己实现的。我们可以通过这种方式来尽量减少XSS攻击。
通常可以通过两种方式开启CSP:
1.设置HTTP Header中的Content-Security-Policy
2.设置meta标签的方式
这里以设置HTTP Header来举例:
只允许加载本站资源:

Content-Security-Policy:default-src 'self'

只允许加载HTTPS协议图片

Content-Security-Policy:img-src https://*

允许加载任何来源框架

Content-Security-Policy:child-src 'none'

CSRF
什么是CSRF攻击?如何防止CSRF攻击?
CSRF即跨站请求伪造,原理就是攻击者构造出一个后端请求地址,诱导用户点击或者通过某些途径自动发起请求。如果用户是在登录状态下的话,后端就以为是用户在操作,从而响应的逻辑。
是一种挟持用户在当前已登录的web应用程序上执行非本意操作的攻击方法。
举个例子,假设网站中有一个通过get请求提交用户评论的接口,那么攻击者就可以在钓鱼网站中加入一个图片,图片的地址就是评论接口:

<img src="http://www.domain.com/xxx?comment='attack'"/>

使用post方式,攻击者同样可以诱导用户进入某个页面。
防范CSRF攻击可以遵循以下几种规则:
1.Get请求不对数据进行修改
2.不让第三方网站访问到用户cookie
3.防止第三方网站请求接口
4.请求时附带验证信息,比如验证码或者Token
SameSite
可以对cookie设置SameSite属性。该属性表示Cookie不随着跨域请求发送,可以很大程度减少CSRF的攻击,但是该属性目前并不是所有浏览器都兼容。
验证Referer
对于需要防范CSRF的请求,我们可以通过验证Referer来判断请求是否为第三方网站发起的。
Token
服务器下发一个随机Token,每次请求时将Token携带上,服务器验证Token是否有效。
点击劫持
什么是点击劫持?如何防范点击劫持?
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过iframe嵌套的方式嵌入自己的网页中,并将iframe设置为透明,在页面中透出一个按钮诱导用户点击。
对于这种攻击的防御的方式:
X-FRAME-OPTIONS
X-FRAME-OPTIONS是一个HTTP响应头,在现在浏览器有一个很好的支持。这个HTTP响应头就是为了防御用iframe嵌套的点击劫持攻击
该响应头有三个可选,分别是:
DENY,表示页面不允许通过iframe的方式展示
SAMEORIGIN,表示页面可以在相同域名下通过iframe的方式展示。
ALLOW-FROM,表示页面可以在指定来源的iframe中展示
JS防御:
对于某些比较老的浏览器并不支持上面的这种方式,那我们只有通过JS的方式来防御点击劫持了。

<head>
  <style id="click-jack">
    html {
      display: none !important;
    }
  </style>
</head>
<body>
  <script>
    if (self == top) {
      var style = document.getElementById('click-jack')
      document.body.removeChild(style)
    } else {
      top.location = self.location
    }
  </script>
</body>

以上代码的作用是通过iframe的方式加载页面时,攻击者的网页直接不显示所有内容。
中间攻击人
中间攻击人是攻击方同时与服务器和客户端建立起连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能够获得双方的通信信息,还能修改通信信息。
通常来说不建议使用WiFi,因为很可能就会发生中间人攻击的情况,如果你在通信的过程中涉及到了某些敏感信息,就完全爆漏给攻击放了。
防御中间人攻击其实并不难,只需要增加一个安全通道来传输信息,HTTPS就可以防御中间人的攻击,但是并不是说使用HTTPS就可以高枕无忧,因为如果你没有完全关闭HTTP访问的话攻击者可以通过某些方式将HTTPS降级为HTTP从而实现中间人攻击。

SQL注入
SQL注入是比较常见的网络攻击之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

应对方法
1.(简单又有效的方法)PreparedStatement
2.使用正则表达式过滤传入的参数
3.字符串过滤
4JSP中调用该函数检查是否包函非法字符
5.JSP页面判断代码:

具体内容链接:https://www.cnblogs.com/baizhanshi/p/6002898.html

转载链接:https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc721851882516c33430a2

你可能感兴趣的:(前端)