Web开发中常见的安全缺陷及解决办法

web|安全|解决

一、不能盲目相信用户输入
二、五种常见的ASP.NET安全缺陷
2.1 篡改参数
2.2 篡改参数之二
2.3 信息泄漏
2.4 SQL注入式攻击
2.5 跨站脚本执行
三、使用自动安全测试工具

正文:

保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长。根据IBM的系统科学协会(Systems Sciences Institute)的研究,如果等到软件部署之后再来修补缺陷,其代价相当于开发期间检测和消除缺陷的15倍。

为了用最小的代价保障应用程序的安全,在代码本身的安全性、抗御攻击的能力等方面,开发者应当担负更多的责任。然而,要从开发的最初阶段保障程序的安全性,必须具有相应的技能和工具,而真正掌握这些技能和工具的开发者并不是很多。虽然学写安全的代码是一个复杂的过程,最好在大学、内部培训会、行业会议上完成,但只要掌握了下面五种常见的ASP.NET应用安全缺陷以及推荐的修正方案,就能够领先一步,将不可或缺的安全因素融入到应用的出生之时。

一、不能盲目相信用户输入

在Web应用开发中,开发者最大的失误往往是无条件地信任用户输入,假定用户(即使是恶意用户)总是受到浏览器的限制,总是通过浏览器和服务器交互,从而打开了攻击Web应用的大门。实际上,黑客们攻击和操作Web网站的工具很多,根本不必局限于浏览器,从最低级的字符模式的原始界面(例如telnet),到CGI脚本扫描器、Web代理、Web应用扫描器,恶意用户可能采用的攻击模式和手段很多。

因此,只有严密地验证用户输入的合法性,才能有效地抵抗黑客的攻击。应用程序可以用多种方法(甚至是验证范围重叠的方法)执行验证,例如,在认可用户输入之前执行验证,确保用户输入只包含合法的字符,而且所有输入域的内容长度都没有超过范围(以防范可能出现的缓冲区溢出攻击),在此基础上再执行其他验证,确保用户输入的数据不仅合法,而且合理。必要时不仅可以采取强制性的长度限制策略,而且还可以对输入内容按照明确定义的特征集执行验证。下面几点建议将帮助你正确验证用户输入数据:

⑴ 始终对所有的用户输入执行验证,且验证必须在一个可靠的平台上进行,应当在应用的多个层上进行。

⑵ 除了输入、输出功能必需的数据之外,不要允许其他任何内容。

⑶ 设立“信任代码基地”,允许数据进入信任环境之前执行彻底的验证。

⑷ 登录数据之前先检查数据类型。

⑸ 详尽地定义每一种数据格式,例如缓冲区长度、整数类型等。

⑹ 严格定义合法的用户请求,拒绝所有其他请求。

⑺ 测试数据是否满足合法的条件,而不是测试不合法的条件。这是因为数据不合法的情况很多,难以详尽列举。

二、五种常见的ASP.NET安全缺陷

下面给出了五个例子,阐述如何按照上述建议增强应用程序的安全性。这些例子示范了代码中可能出现的缺陷,以及它们带来的安全风险、如何改写最少的代码来有效地降低攻击风险。

2.1 篡改参数

◎ 使用ASP.NET域验证器

盲目信任用户输入是保障Web应用安全的第一敌人。用户输入的主要来源是HTML表单中提交的参数,如果不能严格地验证这些参数的合法性,就有可能危及服务器的安全。

下面的C#代码查询后端SQL Server数据库,假设user和password变量的值直接取自用户输入:

SqlDataAdapter my_query = new SqlDataAdapter(

    "SELECT * FROM accounts WHERE acc_user='" + user +

    "' AND acc_password='" + password, the_connection);

从表面上看,这几行代码毫无问题,实际上却可能引来SQL注入式攻击。攻击者只要在user输入域中输入“OR 1=1”,就可以顺利登录系统,或者只要在查询之后加上适当的调用,就可以执行任意Shell命令:

'; EXEC master..xp_cmdshell(Oshell command here')--

■ 风险分析

在编写这几行代码时,开发者无意之中作出了这样的假定:用户的输入内容只包含“正常的”数据——合乎人们通常习惯的用户名字、密码,但不会包含引号之类的特殊字符,这正是SQL注入式攻击能够得逞的根本原因。黑客们可以借助一些具有特殊含义的字符改变查询的本意,进而调用任意函数或过程。

■ 解决方案

域验证器是一种让ASP.NET开发者对域的值实施限制的机制,例如,限制用户输入的域值必须匹配特定的表达式。

要防止上述攻击行为得逞,第一种办法是禁止引号之类的特殊字符输入,第二种办法更严格,即限定输入域的内容必须属于某个合法字符的集合,例如“[a-zA-Z0-9]*”。

2.2 篡改参数之二

◎ 避免验证操作的漏洞

然而,仅仅为每个输入域引入验证器还不能防范所有通过修改参数实施的攻击。在执行数值范围检查之时,还要指定正确的数据类型。

也就是说,在使用ASP.NET的范围检查控件时,应当根据输入域要求的数据类型指定适当的Type属性,因为Type的默认值是String。

<!-- 要求输入值必须是1-9之间的数字 -->

<asp:RangeValidator ... MinimumValue="1" MaximumValue="9" .../>

■ 风险分析

由于没有指定Type属性值,上面的代码将假定输入值的类型是String,因此RangeValidator验证器只能确保字符串由0-9之间的字符开始,“0abcd”也会被认可。

■ 解决方案

要确保输入值确实是整数,正确的办法是将Type属性指定为Integer:

<!-- 要求输入值必须是1-9之间的数字 -->

<asp:RangeValidator ... MinimumValue="1"

    MaximumValue="9" Type="Integer"

2.3 信息泄漏

◎ 让隐藏域更加安全

在ASP.NET应用中,几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于_VIEWSTATE是BASE 64编码的,所以常常被忽略,但黑客可以方便地解码BASE 64数据,用不着花什么力气就可以得到__VIEWSTATE提供的详细资料。

■ 风险分析

默认情况下,__VIEWSTATE数据将包含:

⑴ 来自页面控件的动态数据。

⑵ 开发者在ViewState中显式保存的数据。

⑶ 上述数据的密码签字。

■ 解决方案

设置EnableViewStatMAC="true",启用__VIEWSTATE数据加密功能。然后,将machineKey验证类型设置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。

[1] [2] 下一页  

时间: 2024-12-24 20:32:41

Web开发中常见的安全缺陷及解决办法的相关文章

使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OSS(https://www.aliyun.com/product/oss) 4.HTTPS(http://baike.baidu.com/view/14121.htm) 阅读目录结构 引: 一.准备工作 二.整体功能结构 三.具体实现步骤 四.关键点和问题处理 五.延伸与扩展 六.总结与思考 引:

asp.net开发中常见公共捕获异常方式总结(附源码)_实用技巧

本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统一的处理风格,将异常信息优雅地反馈给开发人员和用户.我们都知道,.net的异常处理是按照"异常链"的方式从底层向高层逐层抛出,如果不能尽可能地早判断异常发生的边界并捕获异常,CLR会自动帮我们处理,但是这样系统的开销是非常大的,所以异常处理的一个重要原则是"早发现早抛出早处理&q

WEB设计技巧:Web开发中经常使用的网站和Web App

文章描述:Web用户体验师Jake Rocheleau撰写了一篇文章分享他在Web开发中经常使用的网站和Web App,其中包含各类字体库.代码库.插件库.配色方案和测试工具.他同时指出,Web开发环境将慢慢转向云端. Web用户体验师Jake Rocheleau撰写了一篇文章分享他在Web开发中经常使用的网站和Web App,其中包含各类字体库.代码库.插件库.配色方案和测试工具.他同时指出,Web开发环境将慢慢转向云端. CodeVisually是一个开源项目.在它的分类目录下有各种插件.

Ajax在进行web开发中的安全性分析

在进行web开发中ajax的安全性如何呢?现在浏览器允许用户提高他们的安全等级,关闭 JavaScript 技术,禁用浏览器中的任何选项.在这种情况下,代码无论如何都不会工作.此时必须适当地处理问题,这需要单独的一篇文章来讨论,要放到以后了(这个系列够长了吧?不用担心,读完之前也许您就掌握了).现在要编写一段健壮但不够完美的代码,对于掌握 Ajax 来说就很好了.以后我们还将讨论更多的细节. Ajax 世界中的请求/响应 现在我们介绍了 Ajax,对XMLHttpRequest对象以及如何创建它

WEB开发中Spring AOP实际应用一例

web   在WEB开发中,用户对网页的访问权限检查是一个重要的环节.以STRUST为例,我们需要在Action的excute方法中编写相关的代码(一般是调用基类的函数),也很显然,在每个Action中这是一种重复劳动. 如果我们在excute运行之前,能够自动去调用基类的权限检查函数,这无疑是个好的解决办法.AOP就为我们提供了这样一种解决方法. 下面以一个简化的实例介绍实现的办法. 首先我们做一个接口: public interface CheckInterface {  public ab

Asp.net,IBatis For .Net,DAOFactory在Web开发中的数据表示

asp.net|web|数据 摘要: 本文谈论的结合Asp.net,IBatis,DAOFactory谈Web开发中的数据表示,展现在ASP.Net开发中各层怎么来组织数据. IBatis For .Net是一个功能强大实用的SQL Map工具,不是ORM工具.它是将SQL语句映射成.NET对象,同时将这个.Net对象与ASP.NET页面中的数据(ASP.NET中Page DataSource我称之为FormBean吧(与J2EE中的FormBean不是同一个概念))结合起来,这样就可以达到这个

Web开发中如何管理ipad屏幕的方向变化

Web开发中,我们会遇到在手机垂直或水平视角时展示不同状态的情况.下面我来总结一下检测移动设备方向变化的一些方法. 1 使用javascript 直接看代码: <script type="text/javascript"> window.onorientationchange = function () { if ( orientation == 0 ) { alert ('Portrait模式, Home键在下边'); } else if ( orientation ==

WEB开发中图片格式的合理选择

从某种程度上说,判断一个网页设计师是否优秀,可以从其在WEB开发(或网页设计)中是否合理的采用各种图片格式得出结论.事实上,或许所有人都知道图片存在GIF,JPG和PNG等格式,但并非所有人都知道它们之间的具体区别和使用技巧. 接下来将给大家介绍:WEB开发中几种最受欢迎图片格式的前世今生以及如何正确的使用它们. 1.JPEG JPEG格式是一种大小与质量相平衡的压缩图片格式.通俗一点讲,就是:高的压缩比=低的图片质量=小的文件大小.反之,低的压缩比=高的图片质量=大的文件大小.由于JPEG文件

对Web开发中前端框架与前端类库的一些思考

  这篇文章主要介绍了对Web开发中前端框架与前端类库的一些思考,本文讲解了前端框架的理解误区.前端框架与前端类库的区别.前端MVC框架思想等内容,需要的朋友可以参考下 说起前端框架,我也是醉了.现在去面试或者和同行聊天,动不动就这个框架碉堡了,那个框架好犀利. 当然不是贬低框架,只是有一种杀鸡焉用牛刀的感觉.网站技术是为业务而存在的,除此毫无意义,框架也是一样.在技术选型和架构设计当中,脱离网站业务发展的实际,一味的追求时髦新技术,可能会适得其反,将网站发展引入崎岖小道.就好像一个日均pv只有