把一个问题说清楚,是要有前提的,也要大家有一些通过的词汇,就像大家谈OO,就知道谈的面向对象,以及面向对象的一些特征;懂设计模式的,一听到"观察者",就立马知道什么意思。
一.下面看看安全的一些概念:
首先,我们来看看什么是安全性?
我们常常提起“实现安全性”“创建安全的系统”。所以安全性一般是定义很多,如:安全性就是保证系统可以完全按照我们想要的方式运行;安全性就是防止以我们不希望的方式运行系统...定义很多,但是不知道大家有没有发现,我们理解的安全的定义很狭窄的。怎么说?我们一般认为安全就是这样的:采取一定的措施(主要是编程代码的措施)处理程序运行时的意外,或者防止意外发生。但是安全的问题不仅仅只是代码的问题,所以在安全编程方面,我们要考虑的更多。
什么是安全
我们不能保证一个系统绝对的安全,不可能做到100%的安全。安全的定义的受到很多的限制,首先我们来看看一个例子。
我们都用过银行的ATM机,如果有人捡到了我们的卡想要盗取我们的钱,那么他只有猜我们的密码。如果密码的长度只有一位数,那么捡卡人第一次猜对的概率就是1/10,他只要十次就可以盗取我们的钱(假设可以不限次数的猜),那么系统的安全行很差;如果密码是2位,那么密码就有100中可能,那么捡卡人第一次才对的几率就是1/100,第二次就是1/99,第三次1/98...系统的安全行也很差.
如果把密码的尝试限制在3次,如果密码为2位数,那么密码被猜出的几率就大大的减小了:
第一次猜中的几率就是1/100
第二次猜中(第一次没有中)的几率就是(99/100) * (1/99)=0.01
第三次猜中(前两次不中)的几率就是(99/100)*(98/99)*(1/98)=0.01
三次之内猜中的几率就是:0.01+1.01+0.01=0.03
所以,当我们限制了尝试的次数的时候,系统就比之前安全了一些,但是系统还并不是很安全,只能说比之前稍微的好了点,但是风险依然很大。
为了使得系统更加的安全,就要减小系统的密码被猜出的可能行,我们可以从两个方面着手:
1.使得密码尝试的次数减小,如用户只能输入一次密码;
2.加大密码的位数,如6位。这样密码被猜出的几率就更加的小了,风险也小了很多,系统的安全行就又提高了。所以,我们常说安全不安全的,都只是一个相对的概念。说了这么多,就是要说一点:不要把安全看死了,安全不安全要看我们的环境。
在谈后面的话题之前,让我们来共享一些术语:
脆弱性是系统的一个特征,它可能会使得应用系统不安全按照我们预想的方式运行。一般表示系统不好的特征。
威胁就是指利用错人性破环系统安全的可能行。
利用就是利用脆弱行的方法。
总结一句话就是:脆弱行导致了威胁,利用则实现了威胁,简言之,攻击。
二、Web应用中的安全问题
首先我们就看看对Web的攻击。攻击有很多种的,其中一部分可以使用ASP.NET代码进行防范的,但是其他的攻击方式还是可以产生破坏的,如直接攻击服务器。下面就来看典型的例子。
我们之前说过,攻击就是利用系统的脆弱性以实现一定的威胁。攻击的结果也很多,如:
未经授权的访问--用户获取了更多的权限,从而可以将应用程序用于其他的途径,如果获取了网站的管理员的密码,散布政治言论。
代码执行--在目标系统上运行恶意代码,而且还会导致其他的威胁,如木马。
拒绝服务--合法用户被禁止访问应用程序
信息失窃--机密的信息被盗取
破坏信息--信息遭到修改。如,站点被涂改,发布攻击性的消息和政治言论。
下面我们就来看看常见的一些脆弱性,以及对它们的利用,以及引起的威胁。