网站系统安全开发手册网站系统开发人员工具书.doc_第1页
网站系统安全开发手册网站系统开发人员工具书.doc_第2页
网站系统安全开发手册网站系统开发人员工具书.doc_第3页
网站系统安全开发手册网站系统开发人员工具书.doc_第4页
网站系统安全开发手册网站系统开发人员工具书.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网站系统安全开发手册 网站系统开发人员工具书 动易网络科技有限公司 2008-8-13 2 安全开发手册 网站系统安全开发手册 目录 目录 第一节 1. 2. 3. 第二节 1. 2. 3. 4. 第三节 1. 2. 3. 第四节 1. 2. 3. 输入验证 . 4 什么是输入 . 4 输入验证的必要性. 4 输入验证技术. 4 3.1 主要防御方式. 4 3.2 辅助防御方式. 6 输出编码 . 9 输出的种类 . 9 输出编码的必要性. 9 输出编码 . 9 常用测试输出方法. 12 防止 SQL 注入 . 13 什么是 SQL 注入. 13 SQL 注入的种类. 13 如何防止 SQL 注入. 13 3.1 SQL 注入产生的原因. 13 3.2 主要防御方式. 13 3.3 辅助防御方式. 16 跨站脚本攻击 . 18 什么是跨站脚本攻击. 18 跨站脚本攻击的危害. 18 如何防止跨站脚本攻击. 18 3.1 3.2 主要防御方式. 18 辅助防御方式. 19 4XSS 漏洞另一个攻击趋势. 20 第五节 1. 2. 3. 跨站请求伪造 . 22 什么是跨站请求伪造. 22 跨站请求伪造的危害. 22 如何防止跨站请求伪造. 22 3.1 主要防御方式. 22 2 3 安全开发手册 第六节 1. 2. 3. 第七节 第八节 32 辅助防御方式. 24 越权操作 . 25 什么是越权操作. 25 越权操作的危害. 25 如何防止越权操作. 25 IO 操作安全. 26 缓存泄漏 . 27 1.什么是缓存泄漏 . 27 2.防御方法 . 27 第九节 系统加密 . 28 1. 主要防御方式 . 28 第十节 信息泄露 . 30 第十一节 日志和监测 . 32 第十二节 Web.config 的安全配置 . 33 1.authentication 节点. 33 2.authorization 节点. 33 3.customErrors 节点 . 33 4.pages 节点 . 34 第十三节 综合实例讲解 . 35 参考资料 41 3 4 安全开发手册 第一节 输入验证 1. 什么是输入 输入是编译时以外的全部数据交换。WEB应用程序 各种来源获取输入,例如所有 用户发送的,或者应用程序运行的往返数据(用户提交的数据、视图状态、cookie、查 询字符串参数等),以及后台数据(数据库、配置数据和其他数据来源)。所有输入的 1 数据都会在某种情况下影响请求的处理。 2. 输入验证的必要性 为什么输入验证如此重要?第一个原因非常明显:用户都不希望使用虚假的数据。 应用程序会处理这些数据,根据它们得出结果,并最终存储到后台数据存储中。网络上 的其他应用程序有可能在某种情况下需要这些数据,这些程序可能依赖于数据的正确性。 1 (如果这些数据没有经过验证,就有可能会带来麻 。) 一切 外部获取的数据都可能是恶意的,如果缺少对数据的验证,将会带来很多安 全问题。如EMAIL 验证、用户名验证等。如:缺少对EMAIL的长度验证,在存储EMAIL 时将出现数据库溢出错误。缺少对EMAIL的格式验证,在发送邮件时将会给程序带来错 误等。 3. 输入验证技术 3.1 主要防御方式 防御手段一:验证控件验证 保护级别: 描述: 对于表现层, 可以利用验证控件,对用户输入的数据进行类型、大小、范围的验证。 验证控件必须做到在客户端和服务端同时验证,客户端的验证可以减轻对服务端请求的 次数和用户操作的方便性。服务端验证确保数据的正确性,同时也防止用户伪造请求绕 过客户端的验证。 优点: 验证简单有效,可重复使用,通常应用于客户端验证较多。 缺点: 验证不完整,有些验证用户可以绕过。 应用举例: 动易SiteFactory系统中,除了使用VS自带的验证控件外,还扩展了和增加了部份 4 5 安全开发手册 验证控件,在 PowerEasy.Framework.Controls 命名空间下,可以看到扩展的 RequiredFieldValidator 控件,邮箱验证控件 EmailValidator 等。具体可以查看文件 夹 Core Items 中PowerEasy.Framework.Controls项目下的ExtendedValidator文件 夹。这些控件一般使用在用户输入的验证,如注册时用户名的验证: 防御手段二:业务逻辑层验证 保护级别: 描述: 关键的地方(涉及到点数、金钱、权限)根据情况还需要在业务层或者数据访问层 进行验证,以保证数据的合法性。对于HTML代码输入的地方,输入时一定要进行HTML 格式化 理,否则有可能会引起全局显示错误。如输入:!- (html注释代码)等。 优点:验证的最后防线,确保数据正确。 应用举例: 动易SiteFactory系统中,在服务端的验证可以用到数据验证类,在命名空间 PowerEasy.Framework.Common下的 DataValidator 类里的相关函数。如:IsNumber(数 字)、IsIP(IP验证)、IsEmail(邮箱格式验证)等。这些验证函数通常应用在紧接 着的客户端验证,或 理重要数据时的验证。如:发送邮箱时 SendEMail(stringemail) 函数里的在发送邮件前验证邮箱是否正确:DataValidator.IsEmail(email)。 防御手段三: 黑名单 保护级别: 描述: 黑名单是看来最简单的途径,不过同时也是最不可靠(有可能让用户绕过)。但在 一些地方也是能起到作用的。 优点:应用简单,快捷。 缺点:不完全可靠,忘记验证的几率高。 应用举例: 动易SiteFactory系统中,黑名单的应用有如:过滤系统 签的输入,先将数据库中 5 6 安全开发手册 所有系统 签转换成别的代替符, 签解释完成后再转换成原字符。函数: PELabelEncode(string value),PELabelDecode(string value)。又如:系统的过滤函数RemoveXSS 也是黑名单的一种利用。适当利用黑名单验证可以直接过滤掉大部份恶意代码。 防御手段四:白名单 保护级别: 描述: 白名单是开发人员定义的合法条件集合,集合以外的任何情况都被视为非法。白名 单可能是允许的字符集合,合法文件名称列表,或者只是可以接受的数据类型列表。它 与黑名单完全相反。由于它把忘记验证的几率降到最小,而且更容易实现,扩展性更强, 所以白名单更加强大。开发人员在验证数据时应该始终使用白名单方法。 优点:可靠性高,扩展性强。 缺点:应用范围较小,通常应用于内容确定的地方。 应用举例: 动易 SiteFactory 系统中白名单的应用有(只列出部份):数据类型转换: DataConverter 类 CDate CLng 等; 允许上传文件类型:m_FileExtArr = gif|png|jpeg|jpg|gif|bmp|fla|swf; 允许使用个别 js:AllowString.xml 名件中的白名单; 允许文件接收参数类型:QueryStrings.config。 白名单一般应用在那些比较确定的输入类型。 3.2 辅助防御方式 除了使用上述技术验证输入外,还可以使用以下防御方式确保输入的正确性。 防御手段一:过滤技术 保护级别: 描述: 过滤技术是通过特定过滤函数,把不允许的数据内容过滤掉,这种方法能确保数据 的正确性,但同时也存在一些过滤不严和过滤太严的问题,总体来说,这也算是增强系 统安全性的一种很有用的方法。 优点:应用范围较广,有一定可靠性。 缺点:函数设计考滤 多,容易忘记需要过滤的内容。 6 7 安全开发手册 应用举例: 动易 SiteFactory 系统中,有多 使用过滤方法,这些过滤函数一般是放在命名空 间 PowerEasy.Framework.Common 下的 DataSecurity 类和 StringHelper 类。如: FilterBadChar 函数、FilterSqlKeyword 函数 、RemoveXss 函数等应用。这些函数常 用在内容过滤的地方,如 RemoveXss 函数主要用于跨站脚本的过滤。 防御手段二:强制转换技术 保护级别: 描述: 除了过滤外,有时也需要强制转换,以确保数据正确和程序的正确运行。如数据层中 的强制转换就是一个很好的例子,程序运行到数据层,如果没有对数据进行强制转换,程 序的出错将暴出系统错误信息或系统的其他机密信息,更重要的是没有了友好的错误提示。 优点:是系统输入的最后一道防线,比较安全。 缺点:容晚转换出错,要带出错处理过程。 应用举例: 动 易 SiteFactory 系 统 中 , 强 制 转 换 函 数 一 般 放 在 命 名 空 间 PowerEasy.Framework.Common 下的 DataConverter 类里,如:CDate(object input)、 CLng(object input) 等 , 还 有 一 些 强 制 转 换 防 出 错 的 函 数 , 在 命 名 空 间 PowerEasy.SqlServerDal 中的 DBHelper 类,如:ToNumber 函数、ToValidId 函数、CLng 函数等。经过这双重保护,确保进入数据库的数据正确性。 防御手段三:输出编码 保护级别: 描述: 输出编码也是一种有效的防止 HTML 注入(XSS 攻击等)的解决方案,具体技术下一章 详细说明。 优点:实现简单有效。 缺点:只针对特定输出。 防御手段四:数据库 束验证 保护级别: 描述: 7 8 安全开发手册 数据库 束是为了保证数据的完整性而实现的一套机制,通过设计数据库 束,可以限 制某些重要字段的数据输入,如: 非空 束,数据类型 束等。大大增强了系统数据的正确 性。 应用举例: 动易SiteFactory系统中,在数据库设计方面就考滤到了数据库约束验证,因此在数据 设计时,就把数据类型都设计好,那些字段允许空,那些不允许都作好了规定。 8 9 安全开发手册 第二节 输出编码 1. 输出的种类 输出编码是转换输入数据为输出格式的过程序,输出格式不包含,或者只是有选择 性的包含允许的特殊字符。 输出的种类有: 1)支持HTML代码的输出 2)不支技HTML代码的输出 3)URL的输出 4)页面内容的输出(Keywords、Description等) 5)js脚本的输出 6)style样式的输出 7)xml数据的输出 8)服务控件的输出 2. 输出编码的必要性 输出编码能有效地防止HTML注入(跨站脚本XSS攻击)等,也能确保输出内容的完 整性和正确性。 3. 输出编码 防御手段一:过滤 保护级别: 描述: 对于支持HTML代码的输出,输出前要确保代码中不含有跨站攻击脚本才能输出。通 过编写过滤函数,进行强制过滤。 优点:支持HTML,有交防止主流XSS攻击。 缺点:有可能出错,函数设计难度大。 应用举例: 动易SiteFactory系统中,目前而言,主要采用函数RemoveXss进行处理,由于 RemoveXss并非十分完善,有待更好的过滤方案。但函数能防止目前主流的XSS攻击。所 以在支持HTML代码的输出,一定要通过这个函数进行过滤(也可以输入到数据库前过滤)。 9 10 安全开发手册 防御手段二:HTML编码 保护级别: 描述: 对于不支持HTML的输出,在输出到页面前要进行Server.HtmlEncode编码,部分服 务器控件或者XSLT转换本身就支持Server.HtmlEncode编码,可不必进行重复编码。 优点:非常可靠。 缺点:不支持HTML输出。 应用举例: 动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的 DataSecurity类中有自定义的编码函数:HtmlDecode和HtmlDecode,这些函数更容易地 控制编码的输出。函数主要用在那些不支持Html的输出。 防御手段三:URL编码 保护级别: 描述: 对于URL的输出,要对输出URL进行Server.UrlEncode处理。 如: 的输出 要确保输出内容的url编码正确,不允许 的输出。 优点:可靠性高。 缺点:应用范围少。 应用举例: 动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的DataSecurity 类中有自定义的URL编码函数UrlEncode和UrlEncode来控制所有URL的输出,以确保输出 的准确性。 防御手段四:转换特殊符号的编码形式 保护级别: 描述: 对于页面内容的输出,要确保输出的正确性和允许输出的数据。 如:页面 的输出。 要确保输出内容中不包含特殊符号: 输出前要转换特殊符号的编码形式, 将 转为 " 同样的输出有 title= 的输出等。 10 11 安全开发手册 对于js脚本的输出,要确保输出代码中不包含跨站脚本,注意 和的输出, 以免被组合成危险的js代码。 如:图片模块,图片地址的输出。 对于style样式的输出,要确保样式的正确性,目前系统主要应用到 题颜色的输出, 如果增加其他样式的输出,要确保样式的安全性才能输出。 对于xml数据的输出,要确保数据中是否有XML不允许的字符,要对特殊字符进行转 换才能输出。目前系统中还存在一些地方存在这样的问题。如: 签的数据源,输出时 没有对特殊符号进行处理,造成输出出错。留言 题中出现 等。 优点:防止因殊符号而出现错误,或跨站。 缺点:检查难度大。 应用举例: 动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的DataSecurity 类中有自定义的编码函数XmlEncode等来控制所有输出,以确保输出的准确性。防止Html 注入的出现。 防御手段五:其他要注意的地方 保护级别: 描述: 对于服务器控件的输出,要注意输出的环境,对于不同的输出环境进行不同的处理, 如url编码,html编码等。 除上述输出外,还有一些特殊的输出形式,应尽量避免使用,或者处理编码后再使 用。如: 11 12 安全开发手册 表格字段 Response.Write(name.Text); Response.Write(Request.Formname); QueryString Response.Write(Request.QueryStringname); Cookies Response.Write( Request.Cookiesname.Valuesname); 直接输出 4. 常用测试输出方法 常用的测试输出语句有: alert(hello);。 1.jpg onmouseover=alert(xss) alert(xss); http:/xxx;alert(xss);var a=a xss& 对输出数据到输出数据的对比,看是否出现问题。 12 13 安全开发手册 第三节 防止SQL注入 1. 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查 询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句, 而成功获取想要的数据。 2. SQL注入的种类 具体而言,SQL注入可分为五大类,分别是:数字型注入、字符型注入、搜索型 注入(like)、in型的注入、句语连接型注入。 应用来说,要特别注意IP、搜索、批量删除、 数据库转到数据库等地方的SQL 注入。 3. 如何防止SQL注入 3.1 SQL注入产生的原因 看下面检查登陆的SQL语句: SqlCommand cmd = new SqlCommand(SELECT * FROM PE_USERS WHERE UserName = + UserName + AND UserPassword = + PassWord + , conn); 由于没有对UserName和PassWord进行任何验证,如果UserName= admin OR 1=1- 所执行的SQL语句就成了: SELECT * FROM PE_USERS WHERE UserName=admin OR 1=1 AND UserPassword= 这就造成了SQL注入,条件永远为真,也就不用密码也能登陆成功。 3.2主要防御方式 防御手段一:参数化查询 保护级别: 描述: 使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。 例如: const string strSql = SELECT * FROM PE_Users WHERE UserName = UserName; Parameters parms = new Parameters(UserName, DbType.String, userName); 中有一个参数UserName, 使用Prarmeter对象,通过它把参数添加到Command对象上, 这样就获得参数化查询。 13 14 安全开发手册 如上述语句,ADO.NET 会向SQL Server 发送下面的SQL语句: Exec sp_executesql N select * from pe_users where username=username ,N username nvarchar(20) ,username=N name SQL Server 把username 替换成字符串name,然后再执行查询. 假设有下面的输入: union select version,null,null 生成的SQL语句如下所示: Exec sp_executesql N select * from pe_users where username=username ,N username nvarchar(20) ,username=N union select version,null,null- 可以看到ADO.NET转义了输入。 public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size); DbTye或SqlDbType可以是多种数据类型。 可根据你的数据类型来选择。 在某些地方,也可似指定参数的长度:int size。这样也能有效防止数据库溢出和SQL注 入的可能性。 优点:有效地防止了SQL注入的产生。 缺点:有些地方不能应用,如 in 。 应用举例: 动易SiteFactory系统中,对于比较固定的地方,我们采用比较安全的存储过程来 现。系统中所有SQL语句,能用参数化查询的所有部份都使用了参数化查询。所有操 作数据库的地方,都能在命名空间 PowerEasy.SqlServerDal下找到。 防御手段二:过滤与转换 保护级别: 14 15 安全开发手册 描述: 对于数据型要强制转换成数字Clng,对于字符型,要通过函数过滤。如: private string SafeSqlLiteral(string inputSQL) return inputSQL.Replace(, ); 对于搜索的地方LIKE 子句,要注意,如果要使用 LIKE 子句,还必须对通配符字 符进行转义: s s s = s.Replace(, ); = s.Replace(%, %); = s.Replace(_, _); 对于in类型,要转换成规格的数字串或字符串。 要尽量少用语句连接形式写SQL语句,要用到的地方要确保连接语句的安全性,或 在白名单内,或限制很短的长度,以防止SQL语句构造的危险。 优点:有效地防止了SQL注入,实现简单。 缺点:容易遗漏,对于某些地方还是不能过滤,如 order by + 变量 应用举例: 动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数 理,过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如: FilterBadChar函数。这函数主要用于业务逻辑层的过滤,对于数据库,我们还使用了 强制转换函数,在命名空间 PowerEasy.SqlServerDal 下的 DBHelper 类 ,如: ToValidId 函数等,主要用于数据库无出错的 理操作。 防御手段三:白名单 保护级别: 描述: 对于一些已知的参数范围,可用白名单的形式处理,能有交防止SQL注入和查询出 错,如:order by +列名,列名以参数形式传入时,可制定一个白名单,先判断一下参 数是否在白名单内,再进行查询,否则出错处理。 优点:安全可靠 缺点:应用范围小 15 16 安全开发手册 3.3 辅助防御方式 防御手段一:严格过滤 保护级别: 描述: 对于不能参数化查询或者无法限制变量类型和范围的情况,使用过滤的手段来处理。 对于数据库中读取的数量要进入查询语句,在不确定数据是否安全的情况下,要对其进入 过滤。这种SQL注入比较 蔽,所以要特别注意。 优点:能用于不能参数化而又难过滤的地方,如 order by +变量 缺点: 过滤过于严格。 应用举例: 动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数 理, 过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如: FilterBadChar函数。 防御手段二:限定URL传递参数的数据类型和范围 保护级别: 描述: 限定URL的传递参数类型、数量、范围等来防止通过构造URL进行恶意攻击。参见MSDN 杂志 优点:在一定的程序上有效地防止通过URL方式的注入。 缺点:容易遗忘正常需要的参数。 应用举例: 动易SiteFactory系统中,需要在ConfigQueryStrings.config配置文件中增加相应的 配置项来控制URL的参数传入,有效控制每个页面的参数数量和参数类型。 防御手段三:全局过滤SQL关键字过滤 保护级别: 描述: 在某些地方进行全局过滤SQL关键字过滤,如对 签的解释。(可能存在过滤不完全和 限制程序开发的问题) 优点:能用于不能参数化而又难过滤的地方,如 table的连接。 16 17 安全开发手册 缺点: 过滤过于严格。 应用举例: 动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数 理, 过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如: FilterSqlKeyword函数,主要应用在标签参数的传入的地方。 更多关于SQL注入,可参考这篇文章: /taiwan/msdn/columns/huang_jhong_cheng/LVSS.htm 17 18 安全开发手册 第四节 跨站脚本攻击 1. 什么是跨站脚本攻击 跨站脚本攻击(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输 入可以显示在页面上对其他用户造成影响的HTML代码, 而盗取用户资料、利用用户身 份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。 2. 跨站脚本攻击的危害 入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的 用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全 损失。如这句简单的Java脚本就能轻易获取用户信息:alert(document.cookie),它会 弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记 录页面中,稍做分析便获取了用户的敏感信息。 跨站脚本攻击的危险,在如今WEB安全越来越得到重视,他的危险性也越来越大。 有效防止跨站脚本攻击,是WEB程序是否安全的一个重要 准。 3. 如何防止跨站脚本攻击 3.1 主要防御方式 防御手段一:编码输出 保护级别: 描述: 对于不支持HTML代码的地方,可用编码输出。如:Server.UrlEncode等方法编码输 出。 优点:安全可靠。 缺点:不支持HTML代码。 应用举例: 动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的 DataSecurity类中有自定义的编码函数:HtmlDecode和HtmlDecode,这些函数更容易地 控制编码的输出。函数主要用在那些不支持Html的输出。 防御手段二:使用UBB编码 保护级别: 18 19 安全开发手册 描述: UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外的一个BBS程序)采 用的一种特殊的TAG。它能有效的限制HTML代码的使用,增强系统输出的安全性。 优点是:简单,容易实现,利用白名单形式,易于控制。 缺点是:只支持小量特定html代码,编辑器功能小。 3.2 辅助防御方式 防御手段一: iframe security=restricted 保护级别:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论