惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
S
Security Affairs
H
Hacker News: Front Page
TaoSecurity Blog
TaoSecurity Blog
W
WeLiveSecurity
G
GRAHAM CLULEY
T
Tenable Blog
Schneier on Security
Schneier on Security
S
Securelist
Cyberwarzone
Cyberwarzone
P
Privacy International News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
C
Cisco Blogs
T
Threat Research - Cisco Blogs
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
D
DataBreaches.Net
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
J
Java Code Geeks
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

蚊子的前端博客

微说 | 有的人觉得只要不考XX,一定能考好!-蚊子的前端博客 微说 | 春天来了-蚊子的前端博客 明天和意外不知道哪个先来-蚊子的前端博客 微说 | 既然错过了路口,就及时止损,重新规划路线上路-蚊子的前端博客 微说 | 2025年的出生人口数是792万-蚊子的前端博客 微说 | 工作年终总结,让写对接的接口的数量?-蚊子的前端博客 微说 | 温家宝:没有政治体制改革的成功 经济体制改革不可能进行到底-蚊子的前端博客 微说 | 违法犯罪了该不该被禁言?-蚊子的前端博客 微说 | 不明白为什么在推荐去俄罗斯旅游-蚊子的前端博客 微说 | 易中天论骗子-蚊子的前端博客 微说 | 一场大风吹散了秋天-蚊子的前端博客 微说 | 既要、又要、还要、更要!-蚊子的前端博客 又是一年的国庆雨季-蚊子的前端博客 微说 | 预估下2025年的出生人口数据-蚊子的前端博客 微说 | 可惜了我那些小时候的书本-蚊子的前端博客 微说 | 牛马有的是,驴不够了!-蚊子的前端博客 微说 | 能否有一条非户口也能高考的路-蚊子的前端博客 微说 | 小聊中医-蚊子的前端博客 微说 | 将要制作的一款新产品-蚊子的前端博客 微说 | 做人要有信-蚊子的前端博客 微说 | 好一个正义联盟-蚊子的前端博客 微说 | 都是见过吃过的主儿-蚊子的前端博客 微说 | 追求8小时工作制有错吗?-蚊子的前端博客 微说 | 如果尖锐的批评完全消失-蚊子的前端博客 微说 | 很好!-蚊子的前端博客 微说 | 封禁用户可以,但要告知具体原因-蚊子的前端博客 微说 | 面朝大海,春暖花开-蚊子的前端博客 微说 | 程序员的悲哀是什么?-蚊子的前端博客 微说 | 2025年出生人口的预测-蚊子的前端博客 前端在 LiveKit 中如何获取所有的参与者-蚊子的前端博客 在 Electron 中使用 LiveKit 实现屏幕共享-蚊子的前端博客 在 Electron 应用中,如何获取 Mac 的摄像头和麦克风权限-蚊子的前端博客 微说 | 不要总让台湾艺人表态-蚊子的前端博客 微说 | 他们总说要更开放-蚊子的前端博客 自己封装 uuid 踩的一个小坑-蚊子的前端博客 CKEditor5 光标在粘贴的图片下一行-蚊子的前端博客 软考出成绩了,没过-蚊子的前端博客 微说 | 也许有一天我们这个社会会进步-蚊子的前端博客 好久没有更新文章了-蚊子的前端博客 微说 | 中共中央关于进一步全面深化改革,推进中国式现代化的决定-蚊子的前端博客 微说 | 关于惩罚性赔偿-蚊子的前端博客 微说 | 生孩子是谁的事儿!-蚊子的前端博客 微说 | 给群众一些选择电视剧的空间-蚊子的前端博客 微说 | 活着-蚊子的前端博客 微说 | 借用睡前消息里面的一段话-蚊子的前端博客 微说 | 曾经梦寐以求的,现在却没了追求-蚊子的前端博客 微说 | 我小时候的那些书本-蚊子的前端博客 给博客添加了一个微说的功能-蚊子的前端博客 今年的双 11 很平静-蚊子的前端博客 微说 | 贪就是贪-蚊子的前端博客 微说 | 总有人说穿越小说为什么不发展工业和科技!-蚊子的前端博客 微说 | 花了很多时间和精力,-蚊子的前端博客 2025 年终于是增加了 2 天的假期-蚊子的前端博客 微说 | 这是我的第一条微说,-蚊子的前端博客 如何手写 Array 的 forEach 方法-蚊子的前端博客 看到聚美优品的没落,真是唏嘘-蚊子的前端博客 如何手写 Array 的 map 方法-蚊子的前端博客 秋意正浓时-蚊子的前端博客 收藏几个常用但访问比较慢的组件的官网网址-蚊子的前端博客 从 Axios 源码分析如何支持 fetch 方法的-蚊子的前端博客 1024,给博客评论区所有的头像戴上一顶可爱的帽子-蚊子的前端博客 使用 GitHub 搭建了一个静态博客-蚊子的前端博客 在 JavaScript 如何判断变量是否为空-蚊子的前端博客 我为什么还在坚持我的个人博客-蚊子的前端博客 不要再手动拼接 URL 参数,请使用 URLSearchParams-蚊子的前端博客 使用 NodeJs 向百度资源推送链接-蚊子的前端博客 工具链极度内卷,留给开发者的性能优化手段已经不多了-蚊子的前端博客 在 React 中显示多个标签,超出省略并可以 hover 显示更多-蚊子的前端博客 蚊子的前端博客:探索与分享前端技术的奇妙之旅-蚊子的前端博客 互联网程序员前景真的一片黑暗吗?-蚊子的前端博客 Deno2.0 正式发布,向 Node.js 兼容-蚊子的前端博客 React 请求数据别再使用 useEffect 和 useState,试试 SWR 吧!-蚊子的前端博客 React 的 useEffect 的一些使用场景和技巧-蚊子的前端博客 前端趣闻之 JavaScript 语言的诞生和发展-蚊子的前端博客 如何合并同一接口的相同参数的请求-蚊子的前端博客 百度搜索中关于蚊子前端博客的奇怪的检索数据-蚊子的前端博客 使用 React 实现 todo list 的 curd 操作-蚊子的前端博客 React 模板中为什么可以用逻辑与运算符-蚊子的前端博客 评论回复在一张表里的评论系统如何进行分页-蚊子的前端博客 React 组件多次调用时如何区分不同的 div 容器-蚊子的前端博客 安全赋值运算符,再也不用写 try-catch 了-蚊子的前端博客 使用 nextjs 重构我的个人博客-蚊子的前端博客 基于 gitlab 的 webhook 向飞书发通知-蚊子的前端博客 数字转换为更高量级单位的工具方法-蚊子的前端博客 如何避免旧请求的数据覆盖掉最新请求-蚊子的前端博客 JavaScript 中 toString 的冷知识-蚊子的前端博客 React 中 useState 和 useRef 与全局变量的区别-蚊子的前端博客 从面试官的角度分析下简历中存在的问题-蚊子的前端博客 使用 React 实现 6 个输入框的短信验证码功能-蚊子的前端博客 反驳那些要实时刷新页面的前端部署方案-蚊子的前端博客 JSON stringify 的一些不常见使用-蚊子的前端博客 JavaScript 中数组 Array 的常见操作-蚊子的前端博客 前端如何提升用户的交互体验-蚊子的前端博客 没有日的日期在iOS中报 Invalid Date 的探究-蚊子的前端博客 飞书很好,但还是没抗住-蚊子的前端博客 给 Antd 的 DatePicker 组件实现带有至今的功能-蚊子的前端博客 antd 的 InputNumber 输入框添加左右的加减按钮-蚊子的前端博客 给想进国央企的同学介绍一款招聘软件「国聘」-蚊子的前端博客 基于 React 和 antd 实现的图片裁剪压缩功能-蚊子的前端博客 uniapp 中 checkbox 中的 checked 不生效的方案-蚊子的前端博客
在红包活动中如何保障账户的安全-蚊子的前端博客
author · 2018-10-30 · via 蚊子的前端博客

我们经常在做一些福利活动来拉动用户的活跃度,提升APP的拉新和拉活。不过总会有些人在寻找我们活动中的漏洞,以此牟利。那么我们是如何预防这些别有用心的人的恶意攻击呢?这里我们就来聊聊是如何防范的

我们经常在做一些福利活动来拉动用户的活跃度,提升APP的拉新和拉活。不过总会有些人在寻找我们活动中的漏洞,以此牟利。那么我们是如何预防这些别有用心的人的恶意攻击呢?这里我们就来聊聊是如何防范的。

首先我们复原下我们活动的玩法: 用户A从客户端内分享自己的专属链接到朋友圈,或者分享到其他地方,分享链接里带有当前用户A的标识、头像、昵称等信息,他的好友B访问这个分享链接时,会读取URL中的参数,然后填充到页面中;用户B点击分享页面中的按钮时,也会将分享者A的标识带入到客户端内,则用户A邀请B成功!用户A和用户B均可获得现金奖励,现金可以进行提现。

首先我们应该知道前端中的攻击都有哪些方式,然后才能针对项目特点进行防范。

1. XSS攻击 #

百科中这样写道:

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。其实在web前端方面,可以简单的理解为一种javascript代码注入。

就是说XSS利用的是用户对指定网站的信任,访问了被注入的恶意代码,造成XSS攻击。

在我们整个活动中,用户可能会修改URL参数的地方有2个:

  1. 用户A分享出来他的专属分享链接后,在微信、QQ等地方传播时,用户A可以修改他自己的分享链接参数后,再让别人访问;
  2. 用户B点击分享链接中的按钮跳转到客户端前,修改URL中的参数,即可修改传递到端内的参数;

在这2种情况里,URL的参数主要有3种:

  • sopenid: 用来让其他用户重新带入到客户端内,分享页里不做处理;
  • nickname: 展示分享者的用户名,这里作为纯文本处理;
  • avatar: 展示分享者的头像,这里对其进行字符串转义;

1.1 节点内容字符串的处理 #

nickname是要直接填充到页面中的,如果没有过滤,就直接对其进行html字符填充,就会造成程序的混乱,或者被填充恶意的链接,用户可能会无意中跳转到第三方的链接中。比如恶意者在url中使用了一段这样的代码:

http://news.qq.com?nickname=<script>while(1){alert('hello world')}</script>

那么用户打开这个链接时,就会无限弹窗;

如果恶意者在url中使用了这样的代码:

http://news.qq.com?nickname=<a style="position:fixed; z-index:999; width: 100%; height: 100%; top:0; left:0;" href="http://www.baidu.com"></a>

用户可能就会不小心跳转到第三方的页面;

因此这里,要么把参数作为纯文本处理,要么对参数里的字符进行转义后再填充:

var escapeHtml = function(str) {
    return str.replace(/</g,'&lt;').replace(/>/g,'&gt;');
}

1.2 节点属性的处理 #

我们也会获取URL参数里的avatar作为用户的头像,若用户使用了这样的代码:

http://news.qq.com?avatar=1"%20onerror="alert(%hello world%27)

那么填充到页面后,就会变成这样:

<img src="1" onerror="alert('hello world')">

chrome会自动防御这种XSS攻击,不过如果在没有自动防御的浏览器上,还是会被弹窗警告,因此这样可以对引号进行转移:

var escapeHtmlProperty = function (str) {
    if(!str) return '';
    return str.replace(/"/g,'&quto;').replace(/'/g,'&#39;').replace(/ /g,'&#32;');
}

2. CSRF攻击 #

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

CSRF攻击,我们前端能做的工作很少,需要后端进行防御工作。

  1. refer限制: 所有非白名单中的refer请求,全部拒绝;
  2. token验证: 客户端发起的请求中带有token,接口验证token的合法性,若token不合法,则认为请求是伪造的;
  3. 客户端时间的校验: 若客户端的本地时间与北京标准时间相差较多时,拒绝;

当然后端接口还有更多的防御工作,我们这里也是简单的举几个例子。

3. https协议 #

在服务器支持https协议时,我们最好把页面按照https的方式开发,要么显式的使用https://或者使用//来让浏览器自己选择。

https协议提供了三个强大的功能来对抗上述的劫持行为:

  1. 内容加密。浏览器到腾讯服务器的内容都是以加密形式传输,中间者无法直接查看原始内容。
  2. 身份认证。保证用户访问的是腾讯服务,即使被 DNS 劫持到了第三方站点,也会提醒用户没有访问百度服务,有可能被劫持
  3. 数据完整性。防止内容被第三方冒充或者篡改。

不过在使用https的过程中,踩了个坑。我在页面中把接口的链接都写成//这种隐式的协议,可是在使用客户端的方法请求接口时发现,客户端的方法不会自动根据页面的协议补全请求接口的协议,需要开发者手动补全协议:

// 通过 window.location.protocol 获取当前页面的协议
let url = window.location.protocol + '//api.qq.com';

3. 验证码 #

验证码的作用不必多说,就是为了区分人/机,确定接下来的行为确实是真实用户发起的,而不是机器模拟产生的。

为了防止提现接口被恶意爆刷,我们在用户在提现前,也添加了验证码的功能,验证用户的合法性,确定请求确实是用户主动发起的提现行为。

4. 账户验证 #

在客户端中的登录过程,是拉起微信登录QQ登录,然后登录微信账号或QQ账号,用户全部的操作都需要验证微信账号和QQ账号的合法性和危险登录,若判定当前账号是危险账号,则阻止其进一步的操作。

5. 客户端的验证 #

客户端的验证,是为了保证请求一定是从客户端发起的,而不是从外部某个地方发起的请求。这块在第2部分里也有说明,就是token的验证,客户端发起的任何请求都是带有token的,然后接口验证token的合法性!

写的这么多措施和方法,大部分也是常见的攻击和防御,但是我们依然不能掉以轻心,稍微有点疏忽,就会给用户和我们活动方造成不可挽回 的损失。