动易安全手册
安全手册(初稿)
目录
一、 输入验证 3
1. 什么是输入 3
2. 输入验证的必要性 3
3. 输入验证技术 3
3.1 主要防御方式 3
3.2 辅助防御方式: 4
二、 输出编码 6
1. 输出的种类 6
2. 输出编码的必要性 6
3. 输出编码 6
4. 常用测试输出方法 8
三、 防止SQL注入 10
1. 什么是SQL注入 10
2. SQL注入的种类 10
3. 如何防止SQL注入 10
3.1 SQL注入产生的原因: 10
3.2主要防御方式: 10
3.3 辅助防御方式 12
四、 跨站脚本攻击 14
1. 什么是跨站脚本攻击 14
2. 跨站脚本攻击的危害 14
3. 如何防止跨站脚本攻击 14
3.1 主要防御方式 14
3.2 辅助防御方式 15
4.XSS漏洞另一个攻击趋势 15
五、 跨站请求伪造 17
1. 什么是跨站请求伪造 17
2. 跨站请求伪造的危害 17
3. 如何防止跨站请求伪造 17
3.1主要防御方式: 17
3.2辅助防御方式: 18
六、 越权操作 19
1. 什么是越权操作 19
2. 越权操作的危害 19
3. 如何防止越权操作 19
七、 IO操作安全 20
八、 系统加密 21
1. 主要防御方式 21
九、 信息泄露 23
十、 日志和监测 24
一、 输入验证
1. 什么是输入
输入是编译时以外的全部数据交换。WEB应用程序从各种来源获取输入,例如所有用户发送的,或者应用程序运行的往返数据(用户提交的数据、视图状态、cookie、查询字符串参数等),以及后台数据(数据库、配置数据和其他数据来源)。所有输入的数据都会在某种情况下影响请求的处理。[1]
2. 输入验证的必要性
为什么输入验证如此重要?第一个原因非常明显:用户都不希望使用虚假的数据。应用程序会处理这些数据,根据它们得出结果,并最终存储到后台数据存储中。网络上的其他应用程序有可能在某种情况下需要这些数据,这些程序可能依赖于数据的正确性。(如果这些数据没有经过验证,就有可能会带来麻烦。)[1]
一切从外部获取的数据都可能是恶意的,如果缺少对数据的验证,将会带来很多安全问题。如EMAIL 验证、用户名验证等。如:缺少对EMAIL的长度验证,在存储EMAIL时将出现数据库溢出错误。缺少对EMAIL的格式验证,在发送邮件时将会给程序带来错误等。
3. 输入验证技术
3.1 主要防御方式
防御手段一:验证控件验证
保护级别:★★★★☆
描述:
对于表现层, 可以利用验证控件,对用户输入的数据进行类型、大小、范围的验证。
验证控件必须做到在客户端和服务端同时验证,客户端的验证可以减轻对服务端请求的次数和用户操作的方便性。服务端验证确保数据的正确性,同时也防止用户伪造请求绕过客户端的验证。
优点:验证简单有效,可重复使用,通常应用于客户端验证较多。
缺点:验证不完整,有些验证用户可以绕过。
防御手段二:数据层验证
保护级别:★★★★☆
描述:
关键的地方(涉及到点数、金钱、权限)根据情况还需要在业务层或者数据访问层进行验证,以保证数据的合法性。在服务端的验证可以用到数据验证类: DataValidator 里的相关函数。如:IsNumber(数字)、IsIP(IP验证)、IsEmail(邮箱格式验证)等。
对于HTML代码输入的地方,输入时一定要进行HTML格式化处理,否则有可能会引起全局显示错误。如输入:<!-- (html注释代码)等。
优点:验证的最后防线,确保数据正确。
防御手段三: 黑名单
保护级别:★★★
描述:
黑名单是看来最简单的途径,不过同时也是最不可靠(有可能让用户绕过)。但在一些地方也是能起到作用的。如:过滤系统标签的输入,先将数据库中所有系统标签转换成别的代替符,标签解释完成后再转换成原字符。系统的过滤函数RemoveXSS也是黑名单的一种利用。适当利用黑名单验证可以直接过滤掉大部份恶意代码。
优点:应用简单,快捷。
缺点:不完全可靠,忘记验证的几率高。
防御手段四:白名单
保护级别:★★★★★
描述:
白名单是开发人员定义的合法条件集合,集合以外的任何情况都被视为非法。白名单可能是允许的字符集合,合法文件名称列表,或者只是可以接受的数据类型列表。它与黑名单完全相反。由于它把忘记验证的几率降到最小,而且更容易实现,扩展性更强,所以白名单更加强大。开发人员在验证数据时应该始终使用白名单方法。
SF中白名单的应用有(只列出部份)
数据类型转换:DataConverter 类 CDate CLng 等。
允许上传文件类型:m_FileExtArr = "gif|png|jpeg|jpg|gif|bmp|fla|swf";
允许使用个别js:AllowString.xml 名件中的白名单
允许文件接收参数类型:QueryStrings.config
优点:可靠性高,扩展性强。
缺点:应用范围较小,通常应用于内容确定的地方。
3.2 辅助防御方式:
除了使用上述技术验证输入外,还可以使用以下防御方式确保输入的正确性。
防御手段一:过滤技术
保护级别:★★★★
描述:
过滤技术是通过特定过滤函数,把不允许的数据内容过滤掉,这种方法能确保数据的正确性,但同时也存在一些过滤不严和过滤太严的问题,总体来说,这也算是增强系统安全性的一种很有用的方法。如:FilterBadChar 函数、FilterSqlKeyword 函数 、RemoveXss 函数等应用。
优点:应用范围较广,有一定可靠性。
缺点:函数设计考滤烦多,容易忘记需要过滤的内容。
防御手段二:强制转换技术
保护级别:★★★★
描述:
除了过滤外,有时也需要强制转换,以确保数据正确和程序的正确运行。如数据层中的强制转换就是一个很好的例子,程序运行到数据层,如果没有对数据进行强制转换,程序的出错将暴出系统错误信息或系统的其他机密信息,更重要的是没有了友好的错误提示。如:ToNumber 函数、ToValidId 函数、CLng函数等。
优点:是系统输入的最后一道防线,比较安全。
缺点:容晚转换出错,要带出错处理过程。
防御手段三:输出编码
保护级别:★★★
描述:
输出编码也是一种有效的防止HTML注入(XSS攻击等)的解决方案,具体技术下一章详细说明。
优点:实现简单有效。
缺点:只针对特定输出。
二、 输出编码
1. 输出的种类
输出编码是转换输入数据为输出格式的过程序,输出格式不包含,或者只是有选择性的包含允许的特殊字符。
输出的种类有:
1)支持HTML代码的输出
2)不支技HTML代码的输出
3)URL的输出
4)页面内容的输出(Keywords、Description等)
5)js脚本的输出
6)style样式的输出
7)xml数据的输出
8)服务控件的输出
2. 输出编码的必要性
输出编码能有效地防止HTML注入(跨站脚本XSS攻击)等,也能确保输出内容的完整性和正确性。
3. 输出编码
防御手段一:过滤
保护级别:★★★☆
描述:
对于支持HTML代码的输出,输出前要确保代码中不含有跨站攻击脚本才能输出。目前而言,主要采用函数RemoveXss进行处理,由于RemoveXss并非十分完善,有待更好的过滤方案。但函数能防止目前主流的XSS攻击。所以在支持HTML代码的输出,一定要通过这个函数进行过滤(也可以输入到数据库前过滤)。
优点:支持HTML,有交防止主流XSS攻击。
缺点:有可能出错,函数设计难度大。
防御手段二:HTML编码
保护级别:★★★★★
描述:
对于不支持HTML的输出,在输出到页面前要进行HtmlEncode编码,部分服务器控件或者XSLT转换本身就支持HtmlEncode编码,可不必进行重复编码。
优点:非常可靠。
缺点:不支持HTML输出。
防御手段三:URL编码
保护级别:★★★★★
描述:
对于URL的输出,要对输出URL进行Server.UrlEncode处理。
如:<img src="输出内容" border="0" alt="logo" /> 的输出
要确保输出内容的url编码正确,不允许“ “ “ 的输出。
优点:可靠性高。
缺点:应用范围少。
防御手段四:转换特殊符号的编码形式
保护级别:★★★★★
描述:
对于页面内容的输出,要确保输出的正确性和允许输出的数据。
如:页面 <meta content="输出内容" name="Keywords" /> 的输出。
要确保输出内容中不包含特殊符号:“ “ “ 输出前要转换特殊符号的编码形式,将“ “ “ 转为 " 同样的输出有 title="" 的输出等。
对于js脚本的输出,要确保输出代码中不包含跨站脚本,注意“‘ ”和“”“的输出,以免被组合成危险的js代码。
如:图片模块,图片地址的输出。
对于style样式的输出,要确保样式的正确性,目前系统主要应用到标题颜色的输出,如果增加其他样式的输出,要确保样式的安全性才能输出。
对于xml数据的输出,要确保数据中是否有XML不允许的字符,要对特殊字符进行转换才能输出。目前系统中还存在一些地方存在这样的问题。
如:标签的数据源,输出时没有对特殊符号进行处理,造成输出出错。留言标题中出现“<” 等。
优点:防止因殊符号而出现错误,或跨站。
缺点:检查难度大。
防御手段五:其他要注意的地方
保护级别:★★★★
描述:
对于服务器控件的输出,要注意输出的环境,对于不同的输出环境进行不同的处理,如url编码,html编码等。
除上述输出外,还有一些特殊的输出形式,应尽量避免使用,或者处理编码后再使用。如:
Response.Write(name.Text);
Response.Write(Request.Form["name"]);
QueryString Response.Write(Request.QueryString["name"]);
Cookies Response.Write(
Request.Cookies["name"].Values["name"]);
直接输出 <%=myVariable %>
4. 常用测试输出方法
常用的测试输出语句有:
<script>alert('hello');</script>。
1.jpg" onmouseover="alert('xss')
"></a><script>alert(‘xss’);</script>
http://xxx';alert('xss');var/ a='a
‘”>xss&<
对输出数据到输出数据的对比,看是否出现问题。
三、 防止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语句就成了:
&n
【相关文章:】
(动易)给评论内容加上留言本的屏蔽垃圾广告功能
安全上网必备:隐藏私密文件四大方法
电脑使用记录清除技巧大放送
WindowsXP的八大安全策略逐个细解
个人电脑详细的安全设置方法
系统安全小技巧:组策略保障共享目录安全
服务器安全之组件安全
ASP.NET+Win2003虚拟主机多个站点的安全设置
操作系统安全配置
防火墙技术与网络安全
【发表评论】【打印此文】【关闭窗口】【点击数: 】
