Web开发安全 | 青训营笔记

134 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天。 本文主要内容是从两个角度看Web安全:Hacker攻击和开发者防御。

(一)攻击篇

跨站脚本攻击(XSS,Cross-Site Scripting)

  • XSS是通过浏览器对网站页面插入恶意交互脚本,并利用网页对用户提交内容的盲目信任,直接转化处理DOM树。
  • 难以从UI上感知(暗地执行脚本)
  • 绘制UI(如弹窗),诱骗用户信息等。
//存储式XSS
/* 恶意脚本存入数据库中,用户访问页面,读取数据库数据写给指定服务器,完成这一过程链路即被攻击。存储式XSS是危害最大的XSS攻击 */
            
fetch("/submit",{
    body:JSON.stringfy({
    id:"1",
    content:'<script>alert(“XSS”);</script>':
    });
});
            
           
//响应式XSS
/* 不涉及数据库,直接从URL上攻击(服务端) */
public async render(e){
    const {params} = e.query;
    e.status = 200;
    e.body = '<div>${params}</div>'
}
              
             
//基于DOM的XSS
/* 不需要服务器参与,通过浏览器发起、执行恶意脚本。 */
const content = new URL(location.href).searchParmas.get("params");
const div = document.createElement("div");
//恶意脚本注入
div.innerHTML = content;
documnet.body.append(div);
               
//基于渲染机制Mutation的XSS
/* 利用了浏览器对DOM渲染的特性不同的浏览器有有区别 */ 
<noscript><p title= "</noscript><img src=x onError=alert{1}>">
<div>
 <noscript><p title="</noscript>
 <imng src="x" onerror="alert(1)">
 "">"
<div>

跨站伪造请求(CSRF,Cross-Site resquest forgery)

在用户不知情前提下,利用用户权限,构造指定HTTP请求,窃取或修改用户敏感信息。

<!-- GET请求 -->
<a href="https://bank.com/transfer?to=hacker&amount=100">点我抽奖</a>

<img style="display:none" src="https//mybaidu.com/login/account="${getAccount()}?token=${localStorage.getItem("atokenofbaidu")}">

注入攻击

SQL注入攻击

image.png

拒绝服务攻击(DoS,Denial of Service)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求积压,进而雪崩效应。

  • ReDoS:基于正则表达式的DoS:

  • DDoS(Distributed DoS):短时间内来自大量僵尸设备的请求流量。通过服务器任意API直接访问IP,占用带宽使得服务器宕机。

  • 中间人攻击:(传输层)利用Web的明文传输,无法验证请求端身份与其请求体是否含篡改内容。

(二)防御篇

跨站脚本攻击(XSS)

  • 永远不信任用户的提交内容,不直接转换成动态DOM
  • 当用户需要使用动态DOM时,应该设置逻辑对上传DOM和解析DOM进行转义 new DOMOarse()

同源请求策略

  • 前端请求时应该保证与服务器的安全策略一致。
  • 同源请求策略要求网页所在目录与请求接口域名一致,不一致则会发生跨域(CORS安全策略)。

跨站伪造请求(CSRF)

image.png

image.png

image.png

SQL注入

  • 最小原则:避免使用root/sudo
  • 允许建立IP白名单 + 过滤
  • 对URL类型参数进行协议、域名、IP等限制。

拒绝服务攻击(DoS)

  • ReDos
    • 减少允许用户使用正则表达式请求
    • 增加校验, 对代码做扫描 +正则性能测试
  • DDos

image.png

  • 中间人攻击
    • HTTP特性: 可靠性-明文加密,完整性:MAC验证;不可抵赖性-数字签名
    • HTTPS加密:在三次握手时进行hash加密,利用公钥和证书进行数字签名校验。

(三)总结

安全一直以来是非常值得关注的话题。想要懂得如何防范各类攻击,就必须先了解他们的攻击原理。有时候很多安全漏洞都是因为没有检验请求,确认发送者身份。这也提醒前端工程师对输入和请求进行必要筛选。