安全:Web 安全学习笔记
背景
说来惭愧,6 年的 web 编程生涯,一直没有真正系统的学习 web 安全知识(认证和授权除外),这个月看了一本《Web 安全设计之道》,书中的内容多是从微软官方文档翻译而来,这本书的含金量不高,不过也不能说没有收获,本文简单记录一下我学习 Web 安全方面的笔记。
本文不涉及 IIS、Windows 和 SqlServer 的安全管理与配置,尽量只谈编程相关的安全问题。
最简单的 Web 物理架构

您必须了解 HTTP 协议,可以阅读这篇文章:HTTP 协议详解,简单总结如下:
- 浏览器和服务器的通信采用无状态的 HTTP 协议。
- 通过控制 HTTP 的请求头,可以控制:客户端缓存、Cookie、请求编码、相应编码等。
- 请求内容向服务器提交数据(POST 和 GET),响应内容向浏览器发送数据。
- Cookie 包含在每个请求和响应中,因此客户端和服务器都可以访问到。
- 一般使用 Cookie 来维护一个浏览器会话(也有其他方式)。
攻击方式总览

这里有一个一般性的介绍:网站安全。
Web 软件安全攻击防护
浏览器安全攻击
Cookie 假冒

定义
非期望的修改 Cookie 的值。
场景
服务器将用户的授权信息存储在 Cookie 中,然后客户端用这些 Cookie 决定导航的显示与否。如果有程序恶意的修改了Cookie,会导致权限提升。
攻击方式
- 注入的 Javascript 代码。
- 使用浏览器调试工具。
- 本机病毒等。
防护措施
- 尽量将 Cookie 设置为 HttpOnly,浏览器伪造不了这种 Cookie。
- 防止 Javascript 注入。
隐藏变量修改

定义
非期望的修改隐藏变量。
场景
订单的折扣计算完全依赖客户端的某个变量,这个变量是从服务器生成的,所有逻辑都在客户端计算,服务器只是接受最后的计算结果。如果有程序恶意的修改了变量,会绕过某些业务逻辑。
攻击方式
- 注入的 Javascript 代码。
- 使用浏览器调试工具。
保护措施
- 防止 Javascript 注入。
- 关键的功能不要依靠客户端控制,要采用服务器控制。
跨站脚本攻击

定义
恶意的提交 Javascript 代码。
场景
在博客的评论功能中,如果用户恶意的提交 Javascript 代码,假如这些 Javascript 没有被过滤,极端的情况下,这些代码会劫持所有访问此页面用户的会话,访问和修改任意数据。
攻击方式
- 注入的 Javascript 代码。
- 使用浏览器调试工具。
保护措施
- 在服务器端验证和过滤恶意输入。
- 开启 ValidateRequest="true"。
- 对输出使用 this.Server.HtmlEncode。
服务器安全攻击
缓冲区溢出

定义
某些可能输入会导致服务器堆栈溢出,这直接致使服务器不可用。
场景
程序提供了某项计算密集型的功能,此功能没有限制用户输入,用户在有意或无意之间输入了一个非法的值,导致了缓冲区溢出。
攻击方式
- 非法输入。
保护措施
- 在服务器端验证和过滤恶意输入。
- 采用防伪式编程。
认证逃避
定义
某些 URL 没有出现在主页导航界面,系统只对导航页面进行了认证和授权管理,这些没有出现在导航中的 URL 可能被恶意用户给分析出来,直接进行访问。
场景
用户管理分为三个页面:List.aspx、New.aspx,程序只对 List.aspx 进行认证和授权了,某些用户直接访问 New.aspx 执行添加操作。
攻击方式
- 直接地址访问。
保护措施
- 梳理网站的整体结构,对所有页面进行认证和授权管理。
非法输入

定义
病从口入,祸从口出。很多攻击方式都是因为非法输入导致的。
场景
程序只在客户端对输入进行了验证,服务器未做任何验证,恶意的程序可以绕过客户端逻辑直接向服务器提交非法输入,这很容易导致各种安全问题。
攻击方式
- 注入的 Javascript 代码。
- 使用浏览器调试工具。
保护措施
- 在服务器端验证和过滤恶意输入。
- 防止 Javascript 注入。
授权逃避
定义
某些 URL 没有出现在主页导航界面,系统只对导航页面进行了认证和授权管理,这些没有出现在导航中的 URL 可能被恶意用户给分析出来,直接进行访问。还有一种可能是:系统只在客户端进行了授权管理,服务器代码并没有进行授权验证,恶意用户很容易就可以逃避授权。
场景
当用户没有 Create 权限的时候,系统只是禁用了浏览器按钮,并没有做服务器授权,然后用户使用浏览器调试工具启用了按钮,就可以执行 Create 了。
攻击方式
- 直接地址访问。
- 修改客户端代码。
保护措施
- 梳理网站的整体结构,对所有页面进行认证和授权管理。
- 在服务器进行授权管理。
SQL 注入

定义
对于和后台数据库产生交互的网页,如果没有对用户输入数据的合法性进行全面的判断,就会使应用程序存在安全隐患。用户可以在可以提交正常数据的URL或者表单输入框中提交一段精心构造的数据库查询代码,使后台应用执行攻击着的SQL代码,攻击者根据程序返回的结果,获得某些他想得知的敏感数据,如管理员密码,保密商业资料等。
场景
服务器程序使用字符串拼接的方式来构造 SQL 语句,这就会导致 SQL 注入攻击的可能。
攻击方式
- 恶意的提交 SQL 片段。
保护措施
- 在服务器端验证和过滤恶意输入。
- 不要拼凑 SQL 参数,采用 DbParameter 设置参数。
- 最小化 SQL Server 访问账户的权限。
异常敏感信息泄露

定义
未处理异常直接显示到浏览器,这会导致敏感信息被泄露,对最终用户来说,也会让他们感觉系统不够安全和易用。
场景
因为开发原因,在某些场景下浏览器将后端的异常直接显示给浏览器了,如:NullReferenceException等。
攻击方式
- 在调用的最上层,为处理掉全部异常。
- 在调用的下层,为封装合适的异常信息。
保护措施
- 定义合理的异常处理策略。
- 异常一定不能跨越边界直接显示到浏览器。
上传攻击

定义
用户恶意的上传外挂、木马和其它程序等。
场景
你做了一个上传功能,结果对上传的文件没有做好足够的控制,比如:某些恶意的用户会上传一些恶意的脚本,然后执行这些脚本。
攻击方式
- 上传恶意文件。
保护措施
- 在服务器端验证和过滤恶意输入,如:后缀名限制。
- 对上传后的文件进行扫描和杀毒。
抵赖

定义
某些用户由于某些原因,不愿意承认自己执行过某些操作,当然,某些操作可能是他们没有意识的情况下执行的。
场景
用户一不小心执行的删除操作,然后立即发现自己操作错误了,然后他打电话给售后,说系统有问题。
攻击方式
- 界面引导不够友好,容易导致误操作,为了推卸责任,进行抵赖。
- 用户恶意的执行操作,然后抵赖。
保护措施
- 提高界面的易用性。
- 关键操作的提醒要足够明显。
- 所有操作要留下操作日志。
数据库安全攻击
连接字符串暴漏
定义
数据库连接字符串中包含用户名和密码,这些信息以明文的形式存储在配置文件中,运维和开发人员都能看得到,随着团队人员的流动,这些敏感信息也会暴漏。
场景
直接将连接字符串配置在 Web.Config 中,而这个文件没有被加密。
攻击方式
- 未加密连接字符串。
- 未加密配置文件。
保护措施
- 加密连接字符串。
- 加密配置文件。
存储数据泄露和篡改
定义
某些敏感信息最终需要被存储在数据库中,如果这些信息被存储为明文,会有很多人员可以看到这些信息,极端情况下,某些黑客攻陷了服务器,也可以看到这些数据。
场景
为加密密码、关键财务信息,税务局来查账了。
攻击方式
- 未加密敏感数据。
- 加密方法过于简单。
保护措施
- 加密敏感数据。
- 对某些数据采用不可逆加密,如:密码。
- 对某些数据采用可逆加密,如:财务数据。
网络安全攻击
拒绝服务攻击
定义
恶意用户试图攻击服务器、网络和系统,最终的目的是让系统不可用,停止对外服务。
场景
恶意用户在尝试并发的无限制的向服务器发送请求,试图让服务器的负载达到最大,最终让系统停止对外服务。
攻击方式
- 攻击网络。
- 攻击服务器。
- 攻击系统。
保护措施
- 在程序级别,识别并拦截恶意的请求。
- 购买第三方安全软件。
传输数组泄露、篡改
定义
恶意的代理服务器或路由器拦截用户的请求,读取或修改敏感数据。
场景
您在咖啡馆发现了一个免费的 WIFI,然后偷偷的接入了,您还暗自高兴,当您使用这个免费的 WIFI 进行网上冲浪的时候,您的各种信息都会被 WIFI 给拦截,如果是恶意的用户,结果可想而知。
攻击方式
- 绑架路由器。
- 免费 WIFI 骗局。
- 为加密的传输协议。
- 未加密的传输数据。
保护措施
- 加强客户端路由的安全管理。
- 慎重的选择代理服务器。
- 使用安全的传输协议,如:SSL。
备注
这篇算是安全方面的 Hello,World了,今后好好好学习一下安全方面的知识,目前找到了两个好的资源,如:
安全:Web 安全学习笔记的更多相关文章
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 【前端】Web前端学习笔记【2】
[2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...
- 【前端】Web前端学习笔记【1】
... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Web前端学习笔记(001)
....编号 ........类别 ............条目 ................明细....................时间 一.Web前端学习笔记 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Web Service学习笔记:动态调用WebService
原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...
- web前端学习笔记
web前端学习笔记(CSS盒子的定位) 相对定位 使用相对定位的盒子的位置常以标准流的排版方式为基础,然后使盒子相对于它在原本的标准位置偏移指定的距离.相对定位的盒子仍在标准流中,它后面的盒子仍以标准 ...
- Web安全学习笔记(一)
Web安全学习笔记(一): URL协议 HTTP协议 1. URL 2. HTTP协议 什么是HTTP HTTP的工作原理 HTTP报文 什么是Cookies HTTP请求方式 Referer请求的功 ...
随机推荐
- CVE-2013-1347Microsoft Internet Explorer 8 远程执行代码漏洞
[CNNVD]Microsoft Internet Explorer 8 远程执行代码漏洞(CNNVD-201305-092) Microsoft Internet Explorer是美国微软(Mic ...
- C#socket编程序(二)
在上一篇中,我列了一些常用的方法,可以说这些方法是一些辅助性的方法,对于分析网络中的主机属性非常有用.在这篇中,我将会介绍一下面向连接(TCP)socket编程,其中辅以实例,代码可供下载. 对于TC ...
- Kafka(四)Kafka在zookeeper中的存储
一 Kafka在zookeeper中存储结构图 二 分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...
- Java与Redis
1.下载Java使用Redis架包并引入 jedis-2.9.0.jar 2.用Java使用Redis如下: package com.jef.redis; import redis.clients.j ...
- Django实战(17):ajax !
现在让我们来通过ajax请求后台服务.当然首选要实现后台服务.关于“加入购物车”,我们需要的服务是这样定义的: url: http://localhost:8000/depotapp/API/c ...
- R语言编程艺术(2)R中的数据结构
本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...
- Java 内存模型基础
一.并发编程模型的两个关键问题 1. 线程之间如何通信 通信是指线程之间以何种机制来交换信息. 在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序 ...
- OpenJudge——0003:jubeeeeeat
OpenJudge——0003:jubeeeeeat 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐节奏要求玩家按下一些指定方块(以下称co ...
- 机器学习之路:python 特征降维 特征筛选 feature_selection
特征提取: 特征降维的手段 抛弃对结果没有联系的特征 抛弃对结果联系较少的特征 以这种方式,降低维度 数据集的特征过多,有些对结果没有任何关系,这个时候,将没有关系的特征删除,反而能获得更好的预测结果 ...
- BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树
题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...