web 安全
前端安全相关的问题
浏览器相关
1、XSS
2、CSRF
3、HTTPS
4、CSP
5、HSTS,强制客户端使用 HTTPS 与服务端建立连接
6、X-Frame-Options,控制当前页面是否可以被嵌入到 iframe 中
7、SRI(subresource intergrity 子资源完整性策略)
防止子资源被恶意篡改注入攻击脚本
1、xxx.js 注入 index.html 中并上传到 cdn
2、用户请求时,根据 xxx.js 取请求,但这个文件可能被篡改
SRI 的作用是,打包的时候根据 js 内容生成一个 hash 值,并且把 hash 值作为 intergrity 属性注入到 script 上。只要哈希不一样,就能认为不一样或者不完整
8、Referer-Policy(控制 http 请求头 referer 的携带策略):用于同源检查,阻止第三方域名访问
Node(服务端)相关
1、本地文件操作
2、ReDos(正则 Dos 攻击)
3、时序攻击
4、ip origin referer / request header(各个网站爬虫防范点)
其他
1、SQL 注入
可以通过前端输入恶意数据,对后端数据库进行非法操作,如果对用户输入的数据没有进行充分的验证和处理,攻击者就可以通过在输入中嵌入特定的恶意 SQL 语句,来改变原本预期的 SQL 操作逻辑。SQL 注入攻击的危害极大,可能导致敏感信息泄露、数据被篡改或删除、服务中断等严重后果。
示例:
如果攻击者用
' UNION SELECT * FROM another_table; --
,那么组合后的 SQL 语句就变成了:--
用于注释掉后续的内容,UNION 操作符用于合并两个或多个 SELECT 语句的结果集,从而获取到其他表中的数据。如果攻击者将
' OR '1'='1
作为用户名输入,那么组合后的 SQL 语句就变成了:由于'1'='1
始终为真,所以这个条件总是成立,无论输入的密码是什么,都能绕过正常的身份验证,获取所有用户的信息
解决方案:
输入验证:对用户输入和数据进行严格的格式和内容验证
数据类型检查:确保输入的数据类型与预期相符
长度限制:设定输入字段的最大长度,防止过长的异常输入
编码处理:对用户输入进行适当的编码,如 HTML 编码,以防止恶意代码被直接执行
客户端校验:使用 JavaScript 等前端脚本在客户端进行初步的输入校验
2、ARP 欺骗
伪造成网关,让受害者的数据经过攻击者的电脑,从而抓取别人的用户信息
3、XFF
payload: X-Forwarded-For:协议头伪造 IP 注入攻击
HTTP X-Forwarded-For
4、DoS / DDoS
5、DNS 劫持
攻击者通过篡改 DNS 服务器的解析结果或用户计算机的 DNS 设置,使得用户在访问特定域名时,被错误地引导到攻击者指定的恶意网站,导致用户无法正常访问原本想要访问的合法网站,而是被重定向到包含欺诈内容、恶意软件下载、虚假广告等的不良页面
点击劫持
在这种攻击中,攻击者通过欺骗手段将一个合法的网站页面嵌套在一个不可见的框架(iframe)内,然后在其上层覆盖一层具有诱导性的界面元素,如按钮、链接等。用户看到的是攻击者设计的具有误导性的界面,当用户进行点击操作时,实际上是在不知情的情况下点击了被隐藏在下方的合法页面中的元素,从而执行了攻击者期望的操作,例如关注某个账号、下载恶意软件、提交敏感信息等。
解决方案:
避免使用透明页面:避免设计全透明或高度透明的页面,减少攻击者利用来隐藏恶意界面的可能性
对敏感操作添加额外的确认步骤
使用 X-Frame-Options 响应头: 通过设置此响应头,明确告知浏览器该页面是否允许被嵌套在 iframe 中。常见的取值有 DENY(完全禁止被嵌套)、SAMEORIGIN(仅允许在同域内嵌套)和 ALLOW-FROM uri(指定允许嵌套的来源)
启用 Content Security Policy(CSP): 通过配置 CSP 策略,可以限制页面中资源的加载来源,包括 iframe 的来源
JavaScript 检测: 在页面加载时,使用 JavaScript 检测页面是否被嵌入在 iframe 中。如果是,则采取相应的措施,如弹出警告提示或者重定向到正常页面。
// window.top!== window.self 用于判断当前窗口是否在一个框架中
// 如果这两个值不相等,说明当前窗口被嵌套在一个框架内
// 如果相等,则表示当前窗口没有被嵌套在框架中,它本身就是顶层窗口
if (window.top!== window.self) {
// 被嵌入在 iframe 中
alert('此页面不允许在 iframe 中显示!');
window.top.location.href = window.location.href;
中间人攻击
中间⼈ (Man-in-the-middle attack, MITM) 是指攻击者与通讯的两端分别创建独⽴的联系, 并交换其所收到的数据, 使通讯的两端认为他们正在通过⼀个私密的连接与对⽅直接对话, 但事实上整个会话都被攻击者完全控制。在中间⼈攻击中,攻击者可以拦截通讯双⽅的通话并插⼊新的内容。
攻击过程如下:
客户端发送请求到服务端,请求被中间⼈截获
服务器向客户端发送公钥
中间⼈截获公钥,保留在⾃⼰⼿上。然后⾃⼰⽣成⼀个伪造的公钥,发给客户端
客户端收到伪造的公钥后,⽣成加密 hash 值发给服务器
中间⼈获得加密 hash 值,⽤⾃⼰的私钥解密获得真秘钥,同时⽣成假的加密 hash 值,发给服务器
服务器⽤私钥解密获得假密钥,然后加密数据传输给客户端