XSS攻击
XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
防范XSS
- 对字符串进行转义,使得恶意脚本不被执行
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
- 验证码:防止脚本冒充用户提交危险操作,防止自动化攻击
- CSP(建立白名单)CSP 允许你定义哪些来源的资源可以被加载和执行,从而限制潜在的攻击 通常可以通过两种方式来开启 CSP:
- 设置 HTTP Header 中的
Content-Security-Policy
- 设置
meta
标签的方式<meta http-equiv="Content-Security-Policy">
CSRF
CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
典型的CSRF攻击流程:
- 受害者登录A站点,并保留了登录凭证(Cookie)。
- 攻击者诱导受害者访问了站点B。站点B收到用户请求后返回一些攻击代码,发出一个请求要求访问站点A的cookie,此时站点B即有了站点A用户的权限
- 站点B向站点A发送了一个请求,浏览器会默认携带站点A的Cookie信息。
- 站点A接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是无辜的受害者发送的请求。
- 站点A以受害者的名义执行了站点B的请求。
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者完成了攻击。
防范CSRF
- SameSite
可以对 Cookie 设置
SameSite
属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击,但是该属性目前并不是所有浏览器都兼容。 - 验证 Referer 对于需要防范 CSRF 的请求,我们可以通过验证 Referer 来判断该请求是否为第三方网站发起的。
- Token 服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。Token 防护机制通过确保请求中包含有效的令牌,并且该令牌与用户的会话关联,有效地防止了 CSRF 攻击。攻击者无法在未知用户的情况下获得有效的 Token,因此无法成功伪造请求。
点击劫持
点击劫持是指在一个Web页面中隐藏了一个透明的iframe,用外层假页面诱导用户点击,实际上是在隐藏的frame上触发了点击事件进行一些用户不知情的操作。
典型点击劫持攻击流程
- 攻击者构建了一个非常有吸引力的网页【不知道哪些内容对你们来说有吸引力,我就不写页面了,偷个懒】
- 将被攻击的页面放置在当前页面的
iframe
中 - 使用样式将 iframe 叠加到非常有吸引力内容的上方
- 将iframe设置为100%透明
- 你被诱导点击了网页内容,你以为你点击的是***,而实际上,你成功被攻击了。
防御点击劫持的方法
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
的方式加载页面时,攻击者的网页直接不显示所有内容了。
中间人攻击
中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。
防范中间人攻击
使用HTTPS。但是并不是说使用了 HTTPS 就可以高枕无忧了,因为如果你没有完全关闭 HTTP 访问的话,攻击方可以通过某些方式将 HTTPS 降级为 HTTP 从而实现中间人攻击。
DNS劫持
DNS 劫持(DNS Hijacking):又被称为域名劫持,DNS 重定向(DNS direaction),是一种 DNS 攻击方式。即是 DNS 查询没有得到正确的解析,以致引导 user 访问到恶意的网站,从而窃取用户隐私,或者进行某些恶意的操作。
如何防范DNS劫持
1.加强本地计算机病毒检查,开启防火墙等,防止恶意软件,木马病毒感染计算机**
2.改变路由器默认密码,防止攻击者修改路由器的 DNS 配置指向恶意的 DNS 服务器**
3.企业的话可以准备两个以上的域名,一旦一个域名挂掉,还可以使用另一个**
4.用 HTTP DNS 代替 Local DNS