在实际的项目开发中,项目的稳定性和安全性都是不可忽略的因素,但目前大部分像我一样的前端小白都对这方面重视程度不够。本文为观看字节直播课所记录的笔记和思考,供大家参考~
web开发安全问题
一、攻击hacker
1.XSS(跨站脚本攻击)
开发者盲目信任用户提交的内容,或者直接将用户提交字符串转化为dom,就容易遭到XSS。
1.XSS特点:
- 暗地执行脚本,难以UI感知
- 植入JS绘制弹窗等UI,诱使用户输入私人信息
2.实现方式
-
存储型:这种方式脚本被存储在数据库中。当用户访问界面时,从服务器读取信息,就会被攻击。这种方式危害性最大,会危及到所有网站用户。
-
反射型:完全从url上完成攻击,攻击者将恶意的SCRIPT标签植入用户请求的字段中。反射脚本由服务器处植入
-
基于DOM的攻击:这种攻击是基于DOM的,完全在浏览器上完成。
-
基于mutation的xss攻击:利用浏览器的不同进行区别攻击,巧妙地绕过XSS过滤工具。这是最难防备的一种攻击方式。
2.CSRF(跨站伪造请求)
暗地里利用用户的cookie构造http请求,窃取或修改用户信息。
例如在其他页面中窃取用户银行账号和cookie,在银行的接口中请求银行转账。这是一种跨站请求。
当用户点击特定的超链接标签或者图片等,就完成了信息窃取。成本很低。
3.injection(注入攻击)
在http请求中注入恶意的数据库参数,这段参数在SQL中运行时,便会导致数据库数据的恶意读取或删改。
注入还有注入命令行、系统命令,服务器端等攻击方式。
可能恶意读取SQL文件,将网站的请求全部代理转化到第三方网站,第三方的服务器可能承受不住挂掉,从而完成对第三方网站的流量攻击。
也可能恶意读取内网访问权限,危害服务系统。
4.DOS(服务拒绝)
攻击者用某种方式构造请求,使得服务器无法响应用户的更多请求,导致雪崩,挂掉。
-
基于正则表达式的DOS模式:
在对正则表达式进行匹配时,如果在//后面不加问号,那就是贪婪模式:有多少匹配多少;如果加了问号,就是只有一个即可匹配。
攻击者利用贪婪匹配的模式,使用回溯的方式,对一个易回溯的字符串进行微调和腰斩等操作,来高效消耗服务器资源。
-
DDoS:构造大量来自僵尸设备的请求,发送给服务器。服务器返回请求后,攻击者却不会相应,导致服务器资源被这些请求绑定无法的到释放,消耗大量资源。
5.中间人攻击
在浏览器和服务器中间插入中间人,欺骗浏览器和服务器,窃取修改两方传输的数据。当传输具有以下特征时,更易遭受中间人攻击:
-
明文传输
-
信息篡改不可知
-
对方身份未验证
这些让我联想到在学习http2.0版本协议时,了解到该协议在传输时会采取不对称加密和对称加密掺杂进行的方式传输,同时传输还是无序的,并标记有相应的帧头。这三个方式想必都是为了防止黑客攻击而做出的智慧策略吧,也许这就是2.0版本协议的优越性之一!前段开发者在进行访问服务器时也要注意防备以上三点错误。
二、防御
1.防御XSS
永远不要相信用户提交的任何内容,也不要将用户内容直接转换为DOM。程序员必须动态生成dom,对用户提交信息进行转译、检查等,也不要让用户自定义跳转链接,定义自定义样式(url,图片等)。
防御xss有一些现成工具,比如react和vue都默认防御xss攻击;服务器端也可以下载一些自动过滤xss攻击的包。
2.csp(内容安全策略)
虽然一般的http策略只允许执行同源的,但在这之外也允许开发者标记其他安全的源/域名,类似于设置白名单。
3.防御csrf
防御csrf的方式非常多,因此必须高效集成一个防御策略。实现方式有:
1.限制csrf的请求来源,以限制伪造请求的发送。
2.也可以通过辨别请求头部实现。请求头部包括origin和referer;也可以在接受合法页面请求时对合法网站进行token标记,这样在以后访问页面时即可校验token是否合法。最好给token设置有效期,以保证安全性。
但要小心iframe攻击:攻击者可能通过button来诱使用户向同源网站发送请求,从而获取token。为了防御这种攻击,http可以设置DENY/SAMORIGN响应头部。
开发者切勿将get和pose接口设置到一起,这样非常不安全。Pose接口要隐藏好。这和刚开始写java代码时,规定的几个类的方法的写法是共通的。刚开始写代码就要培养良好的封装思维!
3.避免用户信息被携带:设置SameSite Cookie属性,使得页面cookie只能在本页面使用,这样就不会被窃取到其他网站。
但是第三方服务依赖cookie怎么办?本页面如果被识别为第三方cookie,那么就无法访问需要的其他页面的资源。应对方式:在服务器端将samesite cookie属性设置为none ,但同时也要标记cookie的安全性,以确保安全识别。
@SameSite属性和CORS属性的区别:
4.防御injection
1.将C库语句进行提前编译:使用prepared statement。
2.原则:所有的命令要给与最小权限;建立白名单;对url的参数类型进行限制,禁止访问内网资源
5.防御DOS
-
少写贪婪匹配
-
扫描代码并进行正则性能测试
-
禁止用户提供的使用正则
6.防御DDoS
进行流量治理策略。
提前设置好快速扩容操作,以抵御突来的流量攻击。
7.防御中间人
https的加密策略是非常好的应对方式。http3内置了https,但目前还处在草案阶段。
三、感想
任何规则的制定都不是凭空而来的,都有其一定的道理。因此写代码时不要懒省事,遵守标准的行业规则,更能保证程序的健壮性。
目前我写的代码距离真正的企业代码还差太多,开发时要考虑的远远比现在的‘输出正确结果’这一条要多太多,还需考虑时间和空间复杂度、安全性等。因此在现在打基础阶段就要树立良好的书写习惯和开发者思维,站在一个真正开发者的角度来审视自己的程序。