关于.net网站的安全性问题以及解决方案的分析

在面试的时候当面试官问道:“你知道怎么提高网站的安全性吗?”这个问题时,我总是回答的不够完整,所以今天我浏览了各大高手的博客,以及通过看书稍微总结一下,也许还是不完整,希望这方面高手也能出来指点一二。

首先探讨一下,什么是网站的安全性

就网站而言,因为网站的定义有许多种,所以各种关于网站安全的定义也不同。有的定义为:网站安全就是保护网上保存的数据和流动的数据,不被别人偷看、窃取或者修改。也有的定义为网站信息安全是指保护信息财产,以防止偶然的或者未授权者对信息的泄露、修改和破坏,从而导致信息的不可行或者无法处理。笔者认为网站的安全定义是指利用利用网站管理控制和技术措施,保证在一个网站环境里,信息数据的机密性、完整性以及可使用性受到保护。

网站安全的主要目标是确保经网站传送的信息在达到目的站时没有任何增加、改变、丢失、或者被非法读取。要做到这一点必须保证网站系统软件、应用软件系统、数据库系统具有一定的安全保护功能,并保证网站部件如终端、调制解调器、数据库链路等功能不不变而且仅仅是那些被授权的人们可以访问。

.net 网站安全的相关技术以及解决办法

1. .net中的身份验证

. net中提供了用户身份验证机制, 其可以通过web. config件的设置来进行。web. config是一个xml文档,根元素是configuration ,其下包含一个system. web节点, system. web节点的下层则是对站点的各种设置。web. config可以设置的标记非常多,如可以用它来保存数据库的一些相关连接数据,进行浏览器的设置,进行编译方式的设定,这样可以避免暴露一些重要的信息。此外,网站中的每一个子目录也可以有一个web. config文件,其设定自动覆盖其父目录的相关设定。在web. config中,其提供了四种身份验证机制: windows验证、forms验证、passport验证和none验证。前两种验证都要对IIS进行相应的配置, Windows验证需要把IIS的目录安全性中的验证方法集成windows验证,而forms验证则要在IIS的目录安全性中的验证方法选中匿名访问, 在forms验证中我们可以使用HTTP客户端重定向将未经身份验证的请求重定向到HTML窗体。Passport身份验证是通过Microsoft的集中身份验证服务执行的, None验证为不执行身份验证

2. Md5加密

如果不想让别人窃取用户密码,那么可以为密码数据创建一个散列。散列是一种单向算法, 一旦数据被转换,将无法再获得其原始值。即使原始数据只发生一个小小的改动, 数据的散列也会发生非常大的变化。如Pork和Porky这两个单词非常相似,但使用散列算法加密后的结果却相去甚远,二者之间没有任何相似之处。大多数开发人员使用数据库存储密码, 但是,在数据库中查找用户数据的人员也能够看到这些密码,如果使用散列算法对密码进行加密后, 则存储在数据库中的密码是加密后的散列数据。. NET开发人员可以使用多种散列算法类。最常用的是SHA1和MD5。

3. 保护隐藏域的安全

在ASP.NET应用中,几乎所有HTML页面的VIEWSTATE隐藏域中都可以找到有关应用的信息。攻击者可以方便地解码BASE64数据,从而得到VIEWSTATE中提供的详细资料,达到窃取用户资料的目的。要解决这个问题,需要设置EnableViewStatMAC=“true”,启用_VIEWSTATE数据加密功能。然后,将machineKey验证类型设置为DES,要求ASP.NET用3DES对称加密算法加密VIEWSTAT数据。

4. 恶意脚本注入攻击问题

恶意脚本注入指用户将恶意的脚本代码输入到网页文本框控件中,如“<script>alert(“你好!”)</script>”。单击网页的提交按钮,
网页首先执行该脚本弹出提示为“你好!”的对话框,即攻击者可以通过向输入框中输入script代码来实现攻击目的。要有效抵抗入侵者的攻击,一方面严密地验证用户输入的合法性,应用程序可以用多种方法执行验证。另一方面,在ASP.NET中使用“<”和“>”来标注脚本代码。因此只需对用户输入的“<”和“>”等恶意代码进行屏蔽,即可阻止网页执行恶意脚本。解决此漏洞的方法是构建一个双层安全过滤系统,对网页中用户发送的数据进行验证和重新编码,确保浏览器只把用户输入的数据作为普通文本内容,而不是一段代码。
过滤代码如下:
Response.Write(Server.HtmlEncode(TextBox1.text));使用这段过滤代码对用户输入的内容重新过滤后,代码中的“<”和“>”字符被过滤并重新编码,恶意代码中的“<SCRIPT>”标记不复存在,浏览器将不会执行没有“<SCRIPT>”标记的脚本代码

5. SQL注入攻击及防范

SQL注入攻击原理。用户输入的主要来源是HTML表单中提交的参数,如果不能严格地验证这些参数的合法性,就有可能危及 服务器的。如下面的例子: 下面是一段常用的用户登录验证的代码: SqlConnectionMyConnection=newSqlConnection(C0nnecti0nString); Strsql="Select*fromuserwherename='"+strUserName+"'andpassword='"+strpassword+"'";

SqlCommandMyCommand=newSqlCommand(strsql,Myconnection);

MyConnection.Open();

SqlDataReaderMyReader=MyCommand.ExecuteReader();zf(MyReader.Read()){ //登录成功}

在上面的代码中如果攻击者在密码框中输入“1’or‘1’=‘1”,则Sql语句变成了select from user where name=‘用户名’andpass-word=‘1’or‘1’=‘1’。计算机根据逻辑计算最终得出结果为真。因此攻击者只需事先知道一个已经存在的用户名就可以任意登录系 统。要防止上述攻击行为,开发者可以对用户输入的值实施限制的机制,即限定输入域的内容必须属于某个合法字符的集合。为密码控件增加一个RegularExpressionValidator验证控件,将ValidationExpression设为[a-z,A-Z,0-9]{1,10},这样就可以限制用户只能输入字母和数字,一些符号将被过滤掉,避免用户输入SQL语句

6. 数据库存储过程
存储过程可以提高系统的安全性, 在规范用户访问信息方面, 它可以提供给用户经过授权的指定信息而不是那些非授权的表的信息。此外存储过程还可以隐蔽SQL代码, 保护网站免受/ SQL注射0攻击, 防止攻击者在SQL语句中非合法地输入参数, 如AND或者OR的操作符来进行非授权操作。存储过程还会隐藏事务逻辑的实现以减少应用程序泄密的危险。ADO. net提供了SqlParameter类, 能为存储过程提供参数的输入与输出, 这提供了一种用来验证用户输入参数的方法, 同时也是深度防范策略的一部分。

7. SQLServer数据库

对于SQLServer数据库,可把数据库与WEB网站分离。同时也必须进行SQLServer的安全配置:

1)使用安全的密码策略 我们把密码策略摆在所有安全配置的第一步,请注意,很多数据库账号的密码过于简单,这跟系统密码过于简单是一个道理。对于sa更应该注意,同时不要让sa账号的密码写于应用程序或者脚本中。健壮的密码是安全的第一步,建议密码含有多种数字字母组合并达9位以上。SQLServer2000安装的时候,如果是使用混合模式,那么就需要输入sa的密码,除非您确认必须使用空密码,这比以前的版本有所改进。同时养成定期修改密码的好习惯,数据库管理员应该定期查看是否有不符合密码要求的账号。

2)使用安全的账号策略 由于SQLServer不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个账号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa账号,只有当没有其他方法登录到SQLServer实例(例如,当其他系统管理员不可用或忘记了密码)时才使用sa。建议数据库管理员新建立个拥有与sa一样权限的超级用户来管理数据库。安全的账号策略还包括不要让管理员权限的账号泛滥。 SQLServer的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员来通过操作系统登录来接触数据库的话,可以在账号管理中把系统账号“BUILTIN\Administrators”删除。不过这样做的结果是一旦sa账号忘记密码的话,就没有办法来恢复了。很多主机使用数据库应用只是用来做查询、修改等简单功能的,请根据实际需要分配账号,并赋予仅仅能够满足应用要求和需要的权限。比如,只要查询功能的,那么就使用一个简单的public账号能够select就可以了。

3)加强数据库日志的记录 审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将其中的审核级别选定为全部,这样在数据库系统和操作系统日志里面,就详细记录了所有账号的登录事件。请定期查看SQLServer日志检查是否有可疑的登录事件发生,或者使用DOS命令。

8. 加密系统管理口令

防止用户直接进入系统后台管理页面,使用口令加密。在用户访问应用程序时,都不希望别人知道自己的信息,同时网管也不想因为安全问题而丢失应用程序的信誉。因此在使用ASP.NET编写应用程序时,使用ASP.NET技术对口令加密。简单的讲,就是将用户提供的口令加密之后,然后让它和存放于系统中的数据比较,如果相同,则通过验证。 ASP.NET中提供了加密的解决方法。在名字空间System.Web.Security中包含了类FormsAuthentication,其中有一个方法Hash-PasswordForStoringInconfigFile。这个方法可以将用户提供的字符变成乱码,然后存储起来,甚至可以存储在cookies中。HashPass-wordForStoringlnConfig-File方法使用起来很简单,它支持“SHA-1”和“MD5”加密算法。在编写会员注册程序中就使用这个方法,把用户提供的口令进行加密后,存储到数据库相应的字段中,当用户登陆的时候,就可以将用户输入的口令加密结果和数据库中的正确结果比较,通过这种办法来验证口令的正确性。把加密程序封装在一个函数里便于重复的使用。

代码如下:

Public string EncryptPasword(string PasswordString,string PasswordFormat)

{

if(PasswordFormat=="SHAI")

{

EncryptPassword=FormsAuthortication.HashPaswordForStoringlnConfigFile(PasswordString,"SHAI");

}

else if(PasswordFormat=="MD5")

{

EncryptPassword=FormsAuthortication.HashPasswordForStoringlnConfigFile(PasswordString,"MD5");

}

else{

EncryptPassword="":

}

}

 

最后小结

网站安全是一个较为复杂的问题。严格的说,没有绝对安全的网络系统,只有通过不断的改进程序,将各种可能出现的问题考虑周全,对潜在的异常情况进行处理,才能减少被黑客入侵的机会。在使用ASP.NET技术建站时,包括上述安全漏洞在内的一些代码安全问题都可能出现,因此需从服务器、程序员等多方面加强安全防范。对服务器来说,要关掉所有用不到的网络服务,对提供网络服务的软件(ApacheMySQLIIS)经常进行更新,并检查各自的程序日志以及时发现入侵现象。对程序员来说,书写代码时要注意严格过滤用户的输入数据,并经常使用工具对ASP.NET网站进行安全检测ASP.NET的安全性较ASP有很大的提高,但用户在开发程序时由于考虑不够周全而产生的安全隐患,还是可以通过一些策略进行预防的。将各种可能出现的问题考虑周全,才能减少被恶意攻击的机会

 


版权声明:本文为wujiaolong1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。