博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Web应用程序安全性简介

Posted on 2009-06-09 13:01  linFen  阅读(2043)  评论(0编辑  收藏  举报

"安全性"的定义

安全性是系统设计、实现和管理的一部分,其作用是保证系统可以完全按照人们想要的方式运行。从另一个角度来说,安全性的作用是防止以我们不希望出现的方式使用系统。

 

"安全"的含义

我们永远不能保证一个系统是完全安全的。这就是说,"安全"并不意味着"百分之百的安全".使用"安全"一词时,实际上是说,如果要凭借现有的知识基础以我们不希望的方式使用系统,那是基本不可能的,进而不必考虑这种情况的发生概率。个人理解这句话是,安全性的提高是减少发生不安全行为的概率。如果当概率足够小的时候,就可以认为是安全的。

 

安全的其他定义

脆弱性(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提供安全的运行环境,必须对   WindowsInternet信息服务(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安全性高级编程》