一、什么是XSS攻击-跨站脚本攻击
跨站脚本攻击(Cross-Site-Scripting)但是缩写是css,重名,所以改为XSS
XSS是跨站脚本攻击,恶意攻击者在web页面中插入恶意的script代码,当用户访问该页面时,恶意的script会执行,达到恶意攻击的目的
XSS的攻击方式就是“教唆”网站去执行本来不存在于这个网页中的前端代码
二、XSS的危害
1.窃取网页浏览中的cookie值
2.劫持流量实现恶意跳转
3.配合csrf攻击完成恶意请求
三、xss的分类
反射型XSS:
“反射”主要指的是服务器把恶意代码反射注入到浏览器端,攻击是一次性的
攻击步骤:
- 攻击者在url后面的参数中加入恶意攻击代码
- 当用户打开带有恶意代码的url链接的时候,网站的服务器将恶意代码从url中取出,然后拼接到html中返回给浏览器端
- 用户浏览器接受到后相应并解析代码,其中的恶意代码也会被执行到
常见的反射型XSS:
- 恶意链接
存储型XSS:
- 攻击是持久性的
攻击步骤:
- 攻击者将恶意代码存放到目标网站的数据库中
- 用户浏览目标网站的时候,网站服务器从数据库中把恶意代码取出,然后拼接到html后返回给浏览器
- 浏览器接受到响应后解析并执行,其中恶意代码也会被执行
如何解决:
- 后端对提交的数据进行过滤
- 前端做一些处理,对script等标签,将特殊字符替换成html编码等
DOM-based型xss:
攻击步骤:
- 攻击者构造出特殊的url,其中url中含有恶意代码
- 用户打开含有恶意代码的url
- 用户浏览器响应解析并执行,前端使用js取出url中恶意代码并执行
四、解决方案
1.cookie安全策略
2.X-XSS-Protection设置
3.XSS防御HTML编码
4.XSS 防御HTML Attribute编码
5.XSS防御之javascript编码
6.XSS 防御之 URL 编码
7.XSS 防御之 CSS 编码
8.开启CSP网页安全政策防止XSS攻击
五、sql注入
在登录界面的时候,都需要输入用户名和密码,如果我输入的密码是‘or’ ‘123’ = ‘123’,在我们查询数据库的时候,拼接以后的sql语句是select * from user where username =''and password ='' or '123' ='123',这样用户名和密码的校验是没有意义的。
sql注入攻击:sql语句伪造参数,然后对参数拼接以后形成xss攻击的sql语句,最后就会导致数据库被攻击了。
解决方案:
- 使用预编译语句,伪造的参数到达服务器端的时候只是简单的字符串,不会形成sql攻击
- 数据库中的密码不应该明文存储,最好采取加密的方式
六、什么是CSRF- 跨站请求伪造
跨站请求伪造(Cross-Site-request-forgery),攻击者盗用了你的身份,以你的名义发送恶意请求
七、CSRF的原理
首先用户C浏览并登录了受信任站点A; 登录信息验证通过以后,站点A会在返回给浏览器的信息中带上已登录的cookie,cookie信息会在浏览器端保存一定时间(根据服务端设置而定); 完成这一步以后,用户在没有登出(清除站点A的cookie)站点A的情况下,访问恶意站点B; 这时恶意站点 B的某个页面向站点A发起请求,而这个请求会带上浏览器端所保存的站点A的cookie; 站点A根据请求所带的cookie,判断此请求为用户C所发送的。 因此,站点A会报据用户C的权限来处理恶意站点B所发起的请求,而这个请求可能以用户C的身份发送 邮件、短信、消息,以及进行转账支付等操作,这样恶意站点B就达到了伪造用户C请求站点 A的目的。
八、完成CSRF攻击
登录受信任的网站A,并且在本地生成cookie 在不登出网站A的情况下,访问恶意网站B
九、如何防御
1.尽量使用POST,限制GET
- 将cookie设置成httpOnly
3.增加token
4.过referer进行识别
十、XSS和CSRF的区别
1.CSRF需要用户进行登录,XSS不需要
2.CSRF是利用网站本身的漏洞,去请求网站,XSS是向网站A中注入JS代码,然后执行代码,篡改网站A的内容