WEB安全编程技术规范(V1.0)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.范围
本规范从应用开发安全管理要求出发,给出了WEB编码安全的具体要求。供浙江公司IT系统内部和厂商使用,适用于省市公司IT系统项目建设WEB工作。
本规范明确定义了JA V A、PHP应用开发中和WEB编码安全相关的技术细节。
与JA V A编码安全相关的内容包括:跨站脚本攻击及解决方法、SQL注入及解决方法、恶意文件执行及解决方法、不安全的直接对象引用及解决方法、跨站请求伪造及解决方法、信息泄露和错误处理不当及解决方法、残缺的认证和会话管理及解决方法、不安全的加密存储及解决方法、不安全的通信及解决方法、限制URL 访问实效解决方法。
与PHP编码安全相关的内容包括:变量滥用及解决方法、文件打开漏洞及解决方法、文件包含漏洞及解决方法、文件上传漏洞及解决方法、命令执行漏洞及解决方法、变量类型缺陷及解决方法、警告及错误信息处理解决方法、PHP与MYSQL 组合的SQL注入解决方法、跨站脚本解决方法。
2.1.规范概述
Web应用程序为结构设计人员、设计人员和开发人员提出一系列复杂的安全问题。最安全、最有能力抵御攻击的Web应用程序是那些应用安全思想构建的应用程序。
在设计初始阶段,应该使用可靠的体系结构和设计方法,同时要结合考虑程序部署以及企业的安全策略。如果不能做到这一点,将导致在现有基础结构上部署应用程序时,要不可避免地危及安全性。
本规范提供一系列安全的体系结构和设计指南,并按照常见的应用程序漏洞类别进行组织。这些指南是Web应用程序安全的重要方面,并且是经常发生错误的领域。
2.实现目标
使用本规范可以实现:
1.确定安全Web应用程序的重要体系结构和设计问题。
2.设计时考虑重要部署问题。
3.制定能增强Web应用程序输入验证的策略。
4.设计安全的身份验证和会话管理机制。
5.选择适当的授权模型。
6.实现有效的帐户管理方法,并保护用户会话。
7.对隐私、认可、防止篡改和身份验证信息进行加密。
8.防止参数操作。
9.设计审核和记录策略。
3.安全编码原则
1.程序只实现你指定的功能
2.永不要信任用户输入,对用户输入数据做有效性检查
3.必须考虑意外情况并进行处理
4.不要试图在发现错误之后继续执行
5.尽可能使用安全函数进行编程
6.小心、认真、细致地编程
4.安全背景知识
本规范主要提供设计应用程序时应该遵循的一些指南和原则。为充分理解本规范内容,请:了解应用程序将会受到的威胁,以确保通过程序设计解决这些问题。解需要考虑的威胁。在程序设计阶段应该考虑到这些威胁。
在应用程序易受攻击的重要环节应用系统的方法。将重点放在程序部署、输入验证、身份验证和授权、加密及数据敏感度、配臵、会话、异常管理以及适当的审核和记录策略上,以确保应用程序具有责任性。
5.JAVA安全编程——OWASP TOP10 AND ESAPI
5.1 OWASP TOP10 与ESAPI
OWASP(开放Web应用安全项目-OpenWebApplicationSecurityProject)是一个开放社群、非营利性组织,目前全球有82个分会近万名会员,其主要目是研议协助解决Web软体安全之准、工具与技术文件,长期致力于协助政府或企业解并改善网页应用程式与网页服务的安全性。
OWASPTOP10是10个最关键的Web应用安全问题清单。这份名单是每隔数年更新(最近2010年)。名单上都是那些通常很简单的,危险的安全问题。这里是一个以在OWASP十大项目的链接。
/index.php/Category:OWASP_Top_Ten_Project
其实简单一点来说,ESAPI就是为编写出更加安全的代码设计出来的一些API,方便使用者调用,从而方便的编写安全的代码。它本身是开源的,同时提供JAVA版本和.NET版本。
代码下载地址:/p/owasp-esapi-java/
下图显示提供的API与OWASP列出的10个安全问题的盖关系:
下图显示结合ESAPI设计你的程序:
下图简单呈现ESAPI如何运作:
5.2 跨站脚本(XSS)
5.2.1定义
跨站脚本是最普遍的web应用安全漏洞。当应用程序在发送给浏览器的页面中包含用户提供的数据,但没有经过适当验证或转译那些内容,这就导致跨站脚本漏洞。
5.2.2危害
攻击者能在受害者浏览器中执行脚本以劫持用户会话、迫害网站、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器等等。
5.2.3种类
已知有三种著名跨站漏洞:1)存储式;2)反射式;3)基于DOM。
反射式跨站脚本通过测试或代码分析很容易找到。
5.2.4解决方法
5.2.4.1.验证输入
验证输入很简单-检查每个输入的有效性。这可能意味着很多东西,但在典型的和简单的情况下,这意味着检查输入类型和数据的长度。例如,如果你是从一个文本框接受一个准的邮政编码,你会知道,唯一有效的类型是一个数字(0-9),而长度应该是6,不能多也不能少。并非所有的案件都如此简单,但很多是相似的。
下图显示验证输入的架构。这里的关键是,一切都进行验证,所有的输入,这并不来自于
应用程序(包括用户输入,请求头,Cookie,数据库数据...)。
实例
getValidInput(ng.Stringcontext,ng.Stringinput,
ng.Stringtype,intmaxLength,boolean allowNull,ValidationErrorList
errors)
isValidInput(ng.Stringcontext,ng.Stringinput,
ng.Stringtype,intmaxLength,boolean allowNull)
StringvalidatedFirstName=ESAPI.validator().getValidInput("FirstName", myForm.getFirstName(),"FirstNameRegex",255,false,errorList);
boolean isValidFirstName=ESAPI.validator().isValidInput("FirstName",
myForm.getFirstName(),"FirstNameRegex",255,false);
5.2.4.2.编码输出
对验证输入的另一面就是编码输出。编码输出,是用来确保字符被视为数据,而不是作为HTML元字符被浏览器解析。这些技术定义一些特殊的"转义"字符。没有正确转义的数据它仍然会在浏览器中正确解析。编码输出只是让浏览器知道数据是不是要被解析,达到攻击无法实现的目的。
需要编码的部分:
1、HTML实体
2、HTML属性
3、Javascript
4、CSS
5、URL