web项目安全大致可以分为两个方面:
1.私密性:资料不被非法获取和利用,只有授权才可以利用。
2.可靠性:资料不丢失不损坏不被篡改。
web安全大概有这么几个层面:
1.代码层。2.架构层面。3.运维层面。
开发者需要的安全问题比如:用户身份被盗用,用户密码泄露,用户资料被盗取,网站数据库泄露等。。。
web安全的重要性:直面用户,挑战严峻;网站和用户安全是生命线;安全事故威胁企业生产、口碑甚至生存;作为开发者应该掌握基础的安全知识,严肃对待这个问题。
学习内容:
跨站脚本攻击XSS,跨站请求伪造攻击CSRF,前端Cookies安全性,点击劫持攻击,传输过程安全问题,用户密码安全问题,SQL注入攻击,信息泄露和社会工程学,其他安全问题。
那么我们需要掌握哪些知识,原生JavaScript,少量后端语言基础(Node),HTTP基础知识(含Cookies/Session),web后端基础知识(HTTP/SQL)。
XSS(Cross Site Scripting)跨站脚本攻击:
Scripting能干啥?
获取页面数据,获取Cookies,劫持前端逻辑,发送请求等。
偷取网站任意数据,偷取用户资料,偷取用户密码和登陆状态,欺骗用户。
XSS攻击分类:
反射型:url参数直接注入;攻击者将代码通过url带过来,页面直接显示这串代码。
存储型:存储到DB读取时注入;xss攻击代码会保存到网站数据中,在用户访问到这条记录,会被从数据库中读取出来显示在页面中。
反射型攻击略小于存储型攻击,因为携带在url中更容易被用户发现。
XSS攻击注入点:
HTML节点内容,HTML属性,JavaScript代码,富文本。
1)HTML节点内容
2)HTML属性
3)JavaScript代码
4)富文本
富文本得保留HTML,HTML有XSS攻击风险。
浏览器自带防御
防御范围:参数出现在HTML内容或属性拦截,在javascript出现中的不拦截,所以说浏览器自带防御非常有限的。
浏览器对XSS攻击防御是有限的,如何针对上述四种XSS攻击进行防御呢?
1.比如事例中的评论,我们只希望用户输入文字,而不是输入html标签。这种情况我们需要对内容进行转义,那转义内容html中的标记(尖括号)
对字符串进行转义
2.JavaScript代码对 进行转义
3.富文本
1)黑名单:在输入的时候进行过滤(正则)
标签,输出的时候过滤比较影响性能。
2)白名单:解析html返回dom树(使用cheerio插件)。
那么针对XSS攻击主要的解决方法就是转义。
CSP(Content Security Policy)内容安全策略
用于指定哪些内容可执行
那么前面讲的几种方法:1)内置函数转义;2)DOM解析白名单;3)第三方库;4)CSP
CSRF(Cross Site Request Forgy)跨站请求伪造
在其他网站对本网站产生影响。也就是其他网站对目标网站,在用户不知情的情况下发起了某些请求。
1)如下图(post请求):写入一个表单,action为接口,以iframe形式插入,发起请求。
2)如下图(get请求):以超链接形式让用户点击进入网站,其实是发送了一个get请求。
也就是所谓的网络蠕虫,扩散范围非常之大。
CSRF攻击原理:
csrf攻击危害
利用用户登陆态,用户不知情,完成业务请求,盗取用户资金(转账、消费),冒充用户发帖背锅,损坏网站名誉。
CSRF攻击如何进行防御?
登陆设置cookies的sameSite属性:
在响应Response Headers里面Set-Cookies:sameSite=strict这个属性,目前兼容性Chrome支持这种防御方式。
在前端页面加入验证信息
前面说过CSRF攻击有几个特征,在访问目标网站后端的时候并不会访问目标网站的前端。那么我们在A网站的前端加一些验证信息,这些信息只有在A网站的前端获得这些信息,如果不经过A网站前端是无法获得这些信息,那么无法验证成功的。
1)验证码<图形验证码ccap>;
2)token;
referer为B网站(来自攻击网站)
包含这个请求是来自哪里的信息请求头。 验证referer,禁止来自第三方网站请求。
利用httpreferer头来防御csrf攻击的原理和方法。
CSRF主要防御方式:
1.禁止第三方网站带Cookies,same-site属性。
2.前端页面加入验证码和token的方式。
3.验证referer。
Cookies
前端数据存储,后端通过HTTP头设置,请求时通过http头传给后端,前端可读写,遵守同源策略。
Cookies特性:
1)域名;
2)有效期;
3)路径;
4)http-only;
5)secure;cookies在缓存中使用,在http中是无法使用的。
document.cookies
Cookies作用
存储个性化设置,存储未登录时用户唯一标识,存储已登录用户的凭证,存储其他业务数据。
一、Cookies-登陆用户凭证
前端提交用户名和密码,后端设置用户名和密码,后端通过http头设置用户凭证,后端访问时后端先验证用户凭证。
直接使用用户ID作为cookies是有很大的隐患,一般使用用户ID+签名(保证说只有我能算出来,别人计算不出来的)。将用户ID+签名发送给后台,如果不一致证明用户userID被篡改过。
秘钥 铭文 签名
常用的还有另外的几种方式:SessionId (把用户数据放在内存中的,通过给前端发送一个随机字符串相当于一个标示,前端是不需要保存的再次请求只需要带上这个标示,就能够在内存中把之前的数据找出,会话)
Cookies和XSS的关系
XSS可能偷取Cookies,htpp-only的Cookies不会被偷。
Cookies和CSRF的关系
CSRF利用了用户的Cookies,攻击站点无法读写Cookies,最好能阻止第三方使用Cookies。
Cookies安全策略
加签名防止篡改,私有变换(加密),http-only(防止XSS),secure,same-site。
点击劫持
原理:通过一个iframe,将目标网站放到页面上,这样用户操作的其实是iframe,将iframe的透明度设置为0,用户可以操作这个iframe。
用户亲手操作,用户不知情。危害:盗取用户资金(转账、消费),获取用户敏感信息。
点击劫持防御:
1)JavaScript禁止内嵌。
防御原理:使用前端js禁止内嵌,发现内嵌就跳走。使用X-FRAME-OPTIONS的http头禁止被iframe。
HTTP窃听:
窃听用户密码,窃听传输敏感信息,非法获取个人资料。
HTTP篡改:
接入广告,重定向网站,无法防御的XSS和CSRF攻击。
运营商劫持.....
HTTS
加密:铭文转换成密文。
怎么样在生产环境部署https,在控制台打开scurity查看证书。
密码安全
密码的作用,密码的存储,密码的传输,密码的替代方案,生物特征密码的密码(指纹、人脸等)。
密码-泄露渠道:
数据库被偷,服务器被入侵,通讯被窃听,内部人员泄露数据,其他网站的密码(撞库)。
密码-存储:
严禁密码铭文存储(防泄露),单向变换(防泄露),变换复杂度要求(防猜解),密码复杂度要求(防猜解),加盐(防猜解)
密码-哈希算法:
明文-密文----一一对应,雪崩效应,密文-铭文无法反推,密文固定长度。
常见哈希算法:
md5,sha1,sha256。
密码-单向变换彩虹表
密码-密码传输的安全性:
https传输,频率限制,前端加密意义有限。
密码生物特性密码:
私密性-容易泄露,安全性-碰撞,唯一性-终身唯一-无法修改。
上传问题
1.上传文件。2.再次访问上传的文件。3.上传的文件被当成程序解析。
上传问题防御:
1.限制上传后缀。2.文件类型检查。3.文件内容检查。4.程序输出。5.权限-可写可执行互斥。
信息泄露
泄露系统敏感信息,泄露用户敏感信息,泄露密码。
信息泄露的途径:错误信息失控,SQL注入,水平权限控制不当,XSS/CSRF。。。
拒绝服务攻击DOS
模拟正常用户,大量占用服务器资源,无法服务正常用户,TCP半链接,Http链接,DNS
大规模分布式拒绝服务攻击DDOS