"安全性"的定义
安全性是系统设计、实现和管理的一部分,其作用是保证系统可以完全按照人们想要的方式运行。从另一个角度来说,安全性的作用是防止以我们不希望出现的方式使用系统。
"安全"的含义
我们永远不能保证一个系统是完全安全的。这就是说,"安全"并不意味着"百分之百的安全".使用"安全"一词时,实际上是说,如果要凭借现有的知识基础以我们不希望的方式使用系统,那是基本不可能的,进而不必考虑这种情况的发生概率。个人理解这句话是,安全性的提高是减少发生不安全行为的概率。如果当概率足够小的时候,就可以认为是安全的。
安全的其他定义
脆弱性(vulnerability)是系统的一个特征,它可能会使应用程序不完全按照预想的方式运行。容易遭受攻击的状态。
威胁(threat)指利用脆弱性破坏系统安全的可能性。
利用(exploit)是一种利用脆弱性的方法,其目的是实现威胁并让系统按照非原定计划的方式运行。在利用脆弱性之前,风险只是理论上的说法。
有些利用模型很小,但他也有些利用将创建复杂的代码.现在对流行软件的脆弱性的新利用,是每时每刻都在进行着的事情。
将这三个概念放在一起看,脆弱性导致了威胁,利用则实现威胁。这个过程就是通常所说的攻击(attack)。
Web应用程序的攻击类型
1.未经授权的访问--用户获得了更多的权限,从而可以将应用程序用于其他途径。这种威胁常常导致其他的威胁,但它可以自行终止。
2.代码执行--在目标系统上运行恶意代码。
3.拒绝服务--合法用户被禁止访问应用程序。
4.信息失窃--私有信息受到危害。
5.破坏信息--信息遭到修改。
对Web应用程序的攻击方式
1.缓冲区溢出
2.脚本注入和跨站点脚本处理
3.SQL注入
4.分布式拒绝服务
5.社交工程
6.蛮力攻击
安全并不仅仅是拦贼于门外
安全还包括在系统内特定用户访问特定权限。用户不能访问没有分配的权限。
安全由谁来负责
程序设计者需要保证程序的结构是安全的。
网络管理员要保证网络和服务器是安全的。
程序员要保证他们的代码不会引入脆弱性。
管理人员要保证他们的团队戒备安全问题。
数据库管理员要确保数据库服务器没有脆弱性。
用户需要提防交社交工程攻击等事情。
当然,还有其他很多任务要做好分开,才能实现安全。
ASP.NET开发人员力所不及的安全问题
1. 网络
Web应用程序是依附于网络才能有效运行的。如果网络连接因为受到拒绝服务式攻击而被中断了,应用程序将不再运行。假如恶意用户可以侦听网络通信量,他们就可以采集到那些不允许他们访问的信息。
2. Web服务器
支持应用程序的服务器必须是安全的。否则,恶意用户可能肆意更改应用程序,而我们所做的安全工作也将徒劳无功。
为了给ASP.NET提供安全的运行环境,必须对 Windows和Internet信息服务(IIS)进行安全配置。对Windows的配置走出了本书的范围,但考虑到很多ASP.NET开发人员同时也负责配置IIS。
3. 数据库服务器
大部分ASP.NET应用程序都要用到数据库。如果数据库被破坏了,应用程序就会受到影响。
4. 客户端
尽管客户端代码对我们很有用处,可我们终究不能控制客户端。举个例子讲,Javascript的确认代码是很有用的,可是总有办法绕过。
ASP.NET开发人员的职责
1. 将安全放在第一位
构建并维护具有一定安全等级的系统,是一件重要而又困难的事情,可很多公司员工认识不到这一点。过去的一段时间里,安全往往是被视为外部问题,而不是作为核心问题来考虑的。
客户和管理者永远也不会同意为了某个功能而花费金钱,除非他们能够看到明显的好处。如果要获得在安全问题上投入时间和金钱的好处,就要理解忽视安全问题所带来的风险。
作为程序员,有责任教育公司里的其他人,使他们懂得安全的重要性。我们应该确保人们不再像以前那样轻描淡写地讨论安全问题,而是把它当做一个核心功能能引入系统。还要确保安全在应用程序部署以及其他方面都保持有优先的权利。
安全功能永远都应该是系统的一个核心功能。如果不是,我们应该要求它得到重视。
2. 实现稳固的安全功能
为了达到系统安全的目的,作为ASP.NET开发人员,我们显然应该在应用程序中增加功能,使它支持安全性。对控制应用程序的使用方式进行一些恰当的选择,这也是我们肩负的责任。
请务必记住,最安全的系统都是经过严格测试和审查的。这意味着解决安全问题的时候,使用已有的解决方案几乎总是比自己编写代码要好。即使是对已有的方案做很小的修改,也要进行周密的检查,确保修改不会破坏安全。
3. 避免增加新的脆弱性
向应用程序中增加的每一句代码,都可能会增添新的脆弱性。对这部分新代码必须严格审查,以确保它们不会造成可能危及应用程序的安全漏洞。一个相对好的方法是,从最初阶段就确保开发中的应用程序的每部分都是安全的。
4. 帮助用户提高安全意识
教育用户使他们懂得安全问题,这是非常有益的。从实施社交攻击的人数就可以看出,现在用户本身就提供了经常被利用的脆弱性。
可是不管怎样努力地教育用户,总是还有用户对他人的建议不加重视。所以,在安全问题上不能够依赖用户。对待用户不妨强制他们尽可能地保证安全,不给非技术人员作出决定的机会,因为他们的决定可能造成不安全。
5. 警惕数据的流动和泄漏
数据可能由连线流入客户端的时候更是如此,因为客户端是我们不能控制的。
6. 保持更新
大部分的脆弱性都是在出现不久就被解决,这往往是由软件厂商发布补丁来实现的,紧跟他们的动态,使用补丁,接受保护。
一些安全建议
1.没有百分之百的安全,但还是应该尽可能地加强防范。
2.隐藏起来并不安全,永远假定攻击者知晓系统内情。
3.应用程序的安全程度由它最薄弱的环境决定,把系统每个部分都看作可能遭受攻击的对象,并注意和其他系统安全负责人员保持良好的沟通。
4.安全问题在开发过程的每一阶段都很重要,优先考虑安全问题,不要出了问题再后悔。
5.安全领域的工作是做不完的,若要维护安全,请制定动态工作计划。
6.过分限制的安全可能不利于产品开发,要考虑到系统的日常用户如何对待安全系统。
7.安全并不完全是技术问题,把安全当作业务的关键方面的来考虑。
8.不可依赖用户来维护安全,向用户提供选择机会的时候,要考虑到最坏的情况,只要有不安全的选项,用户就有可能采纳它。
本文节录自《ASP.NET安全性高级编程》