老生长谈的问题,社区有很多总结的非常完善的好文。笔者在这记录一下自己的见解,有时间了再补充细节。
跨站脚本攻击XSS
是一种代码注入攻击,通过恶意注入脚本在浏览器运行,然后盗取用户信息。
其实XSS攻击本质上还是因为网站没有过滤恶意代码,与正常代码混在一起后,浏览器没有办法分辨哪些是可信的,然后恶意代码也被执行。然后可能导致以下情况:
页面数据或用户信息被窃取,如dom、cookie、localstorage;
修改dom,比如伪造登录窗口或在页面生成浮窗广告;
监听用户行为,比如在登录银行等站点用addEventListener监听键盘事件,窃取账号密码信息;
流量劫持向其他网站。
XSS分类
XSS攻击有三种类型:存储型,反射性,dom型。
存储型:是在有发帖评论等带有数据保存功能的网站的input、textarea将恶意代码提交到网站数据库中,比如使用script src="http://恶意网站"
/script。然后显示评论的页面就会从数据获取,并直接执行这个script标签里的恶意代码;
反射性:是攻击者将恶意js脚本作为用户发送给网站请求中的一部分,然后网站又把恶意脚本返回给用户,这时候就会在页面中被执行。比如打卡包含带恶意脚本的链接,当打开后会向服务器请求,服务器会获取URL中的数据然后拼接在HTML上返回,然后执行。它和存储型不同的是不会储存在服务器里;
基于dom型:就是攻击者通过一些劫持手段,在页面资源传输过程中劫持并修改页面的数据,插入恶意代码。
XSS防范
两个方面:1.恶意代码提交时,2.浏览器执行恶意代码时
1.对输入框的内容进行过滤或使用转义符进行转码;
2.使用CSP(白名单),告诉浏览器哪些外部资源可以加载执行,让即使插入进来恶意代码的也不会执行,或者可以向哪些第三方站点提交数据。开启白名单的方式有两种:
使用meta标签 meta http-equiv="Content-Security-Policy";
设置http头部的Content-Security-Policy。
3.对一些敏感信息进行保护,在cookie信息中添加httponly,告诉浏览器再保存cookie,且不要对客户端脚本开放访问权限,然后就不能通过document.cookie获取cookie了;
set-cookie:
widget_session=123456;httpOnly
4.使用验证码,避免脚本伪装成用户执行一些操作。
跨域请求伪造CSRF
主要是利用用户的登录状态发起跨站请求,比如邮箱里的乱七八糟的链接,打开链接的时候邮箱肯定是处于登录状态,然后黑客就可以用这个登录状态,伪造带有正确cookie的http请求,直接绕过后台的登录验证,然后冒充用户执行一些操作。
CSRF类型
发起CSRF攻击有三个必要条件
1.目标网站一定要有csrf漏洞
2.用户登录过目标网站,并且浏览器保存了登录状态
3.需要用户主动打开第三方站点
本质利用cookie在同源请求中携带发送给服务器的特点,来实现冒充用户
csrf攻击也有三种类型
1.自动发get类型:比如img或iframe标签等,当用户打开这个网站时会自动发起带cookie的资源请求
img src="http://恶意网站"
2.自动发post类型:比如整一个隐藏的表单,在用户进入页面的时候自动提交表单
form id="hack" action="http://恶意网站" method="post"
...
form
script document.getElementById('hack').submit() script
3.诱导链接型:就是诱导用户主动点击链接,比如a标签
a href="http://恶意网站" 点击领取大礼包 a
a href="http://恶意网站" 点击下载美女视频 a
CSRF防范
1.在cookie中添加SameSite属性,这个属性有三个值
strict 严格模式,完全禁止使用cookie
lax 宽松模式 允许部分情况使用cookie,跨域的都行,a标签跳转,link标签,get提交表单
none 任何情况下都会发送cookie,但必须同时设置secure属性,意思是需要安全上下文,cookie只能通过https发送,否则无效
2.验证请求来源 服务器根据http请求头中的origin或referer属性判断是否为允许访问的站点,从而请求过滤。优先判断origin,如果两个都不存在的话就直接阻止
referer,记录了请求时从哪个链接跳过来的并且包含了路径信息,接就是来源地址。不过这家伙不太可靠,所以后来又新增了origin属性
referer:juejin.cn/editor/draf…
origin 记录了域名信息,没有具体的url路径
origin: juejin.cn
3.token验证 服务器向用户返回一个随机数token,再次请求时在请求头中以参数的形式添加入这个token,然后服务器验证这个token,如果没有或者内容不正确,就拒绝请求,缺点是
a.每个请求都得到添加比较繁琐
b.单方面验证cookie可能会被冒用
c.如果网站不止一台服务器,通过负载均衡转到了其他服务器的话,其他所有服务器中的session中都得到了保留token,不然就验证不了
4.双重验证cookie
利用攻击者只能利用cookie,不能获取cookie的特点,用户访问页面时,服务器向请求域名添加一个cookie随机字符串,然后,用户再次请求时从cookie中的数据和参数中的数据进行验证,不一样就拒绝请求
缺点是如果网站存在XSS漏洞,这法子就会失效,而且不能做到子域名的隔离
中间人攻击
在http传输过程中容易被中间人窃取、伪造、篡改,这种攻击方式称为中间人攻击
中间人攻击防范
使用https:发送CA证书,大大的增加了中间人攻击的成本
点击劫持
点击劫持是一种视觉欺骗的手段,攻击者将需要攻击的网站通过iframe嵌套的方式嵌入自己的网页中,并将iframe设置为透明,在页面中透出一个按钮诱导用户点击。
点击劫持防范
可以在http相应头中设置X-FRAME-OPTIONS来防御用iframe嵌套的点击劫持攻击。通过不同的值,可以规定一些情况才能作为iframe来使用。
SQL注入攻击
指的是攻击者在http请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令,恶意SQL被一起构造,破坏原有的SQL结构,并在数据库中执行,达到编写程序时意料之外结果的攻击行为。
防范SQL注入
1. 验证输入类型,譬如id查询数据,必须是整型。
2. 转义特殊字符。
记录记录!