ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:980.13KB ,
资源ID:24069697      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24069697.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(WEB安全编程技术规范V10.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

WEB安全编程技术规范V10.docx

1、WEB安全编程技术规范V101. 范围本规范从应用开发安全管理要求出发,给出了WEB编码安全的具体要求。供浙江公司IT系统内部和厂商使用,适用于省市公司IT系统项目建设WEB工作。本规范明确定义了JAVA、PHP应用开发中和WEB编码安全相关的技术细节。与JAVA编码安全相关的内容包括:跨站脚本攻击及解决方法、SQL注入及解决方法、恶意文件执行及解决方法、不安全的直接对象引用及解决方法、跨站请求伪造及解决方法、信息泄露和错误处理不当及解决方法、残缺的认证和会话管理及解决方法、不安全的加密存储及解决方法、不安全的通信及解决方法、限制URL访问实效解决方法。与PHP编码安全相关的内容包括:变量滥用

2、及解决方法、文件打开漏洞及解决方法、文件包含漏洞及解决方法、文件上传漏洞及解决方法、命令执行漏洞及解决方法、变量类型缺陷及解决方法、警告及错误信息处理解决方法、PHP与MYSQL组合的SQL注入解决方法、跨站脚本解决方法。2. 1.规范概述Web应用程序为结构设计人员、设计人员和开发人员提出一系列复杂的安全问题。最安全、最有能力抵御攻击的Web应用程序是那些应用安全思想构建的应用程序。在设计初始阶段,应该使用可靠的体系结构和设计方法,同时要结合考虑程序部署以及企业的安全策略。如果不能做到这一点,将导致在现有基础结构上部署应用程序时,要不可避免地危及安全性。本规范提供一系列安全的体系结构和设计指

3、南,并按照常见的应用程序漏洞类别进行组织。这些指南是Web应用程序安全的重要方面,并且是经常发生错误的领域。2.实现目标使用本规范可以实现:1. 确定安全Web应用程序的重要体系结构和设计问题。2. 设计时考虑重要部署问题。3. 制定能增强Web应用程序输入验证的策略。4. 设计安全的身份验证和会话管理机制。5. 选择适当的授权模型。6. 实现有效的帐户管理方法,并保护用户会话。7. 对隐私、认可、防止篡改和身份验证信息进行加密。8. 防止参数操作。9. 设计审核和记录策略。3.安全编码原则1. 程序只实现你指定的功能2. 永不要信任用户输入,对用户输入数据做有效性检查3. 必须考虑意外情况并

4、进行处理4. 不要试图在发现错误之后继续执行5. 尽可能使用安全函数进行编程6. 小心、认真、细致地编程4.安全背景知识本规范主要提供设计应用程序时应该遵循的一些指南和原则。为充分理解本规范内容,请:了解应用程序将会受到的威胁,以确保通过程序设计解决这些问题。解需要考虑的威胁。在程序设计阶段应该考虑到这些威胁。在应用程序易受攻击的重要环节应用系统的方法。将重点放在程序部署、输入验证、身份验证和授权、加密及数据敏感度、配置、会话、异常管理以及适当的审核和记录策略上,以确保应用程序具有责任性。5.JAVA安全编程OWASP TOP10 AND ESAPI5.1 OWASP TOP10 与ESAPI

5、OWASP(开放Web应用安全项目-OpenWebApplicationSecurityProject)是一个开放社群、非营利性组织,目前全球有82个分会近万名会员,其主要目是研议协助解决Web软体安全之准、工具与技术文件,长期致力于协助政府或企业解并改善网页应用程式与网页服务的安全性。OWASPTOP10是10个最关键的Web应用安全问题清单。这份名单是每隔数年更新(最近2010年)。名单上都是那些通常很简单的,危险的安全问题。这里是一个以在OWASP十大项目的链接。:/.owasp.org/index.php/Category:OWASP_Top_Ten_Project其实简单一点来说,E

6、SAPI就是为编写出更加安全的代码设计出来的一些API,方便使用者调用,从而方便的编写安全的代码。它本身是开源的,同时提供JAVA版本和.NET版本。代码下载地址::/下图显示提供的API与OWASP列出的10个安全问题的盖关系:下图显示结合ESAPI设计你的程序:下图简单呈现ESAPI如何运作:5.2 跨站脚本(XSS)5.2.1定义跨站脚本是最普遍的web应用安全漏洞。当应用程序在发送给浏览器的页面中包含用户提供的数据,但没有经过适当验证或转译那些内容,这就导致跨站脚本漏洞。5.2.2危害攻击者能在受害者浏览器中执行脚本以劫持用户会话、迫害网站、插入恶意内容、重定向用户、使用恶意软件劫持用

7、户浏览器等等。5.2.3种类已知有三种著名跨站漏洞:1)存储式;2)反射式;3)基于DOM。反射式跨站脚本通过测试或代码分析很容易找到。5.2.4解决方法5.2.4.1.验证输入验证输入很简单-检查每个输入的有效性。这可能意味着很多东西,但在典型的和简单的情况下,这意味着检查输入类型和数据的长度。例如,如果你是从一个文本框接受一个准的邮政编码,你会知道,唯一有效的类型是一个数字(0-9),而长度应该是6,不能多也不能少。并非所有的案件都如此简单,但很多是相似的。下图显示验证输入的架构。这里的关键是,一切都进行验证,所有的输入,这并不来自于应用程序(包括用户输入,请求头,Cookie,数据库数据

8、.)。 实例getValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,boolean allowNull,ValidationErrorListerrors)isValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,boolean allowNull)StringvalidatedFirstName=ESAPI.validator().ge

9、tValidInput(FirstName,myForm.getFirstName(),FirstNameRegex,255,false,errorList);boolean isValidFirstName=ESAPI.validator().isValidInput(FirstName,myForm.getFirstName(),FirstNameRegex,255,false);5.2.4.2.编码输出对验证输入的另一面就是编码输出。编码输出,是用来确保字符被视为数据,而不是作为HTML元字符被浏览器解析。这些技术定义一些特殊的转义字符。没有正确转义的数据它仍然会在浏览器中正确解析。编码

10、输出只是让浏览器知道数据是不是要被解析,达到攻击无法实现的目的。需要编码的部分:1、HTML实体2、HTML属性3、Javascript4、CSS5、URL下图像显示编码输出的架构。 实例1HTML实体编码/performinginputvalidationStringcleanComment=ESAPI.validator().getValidInput(comment,request.getParameter(comment),CommentRegex,300,false,errorList);/checktheerrorListhere./performingoutputencoding

11、fortheHTMLcontextStringsafeOutput=ESAPI.encoder().encodeForHTML(cleanComment); 实例2URL编码/performinginputvalidationStringcleanUserName=ESAPI.validator().getValidInput(userName,request.getParameter(userName),userNameRegex,50,false,errorList);/checktheerrorListhere./performingoutputencodingfortheurlcont

12、extStringsafeOutput=/admin/findUser.do?name=+ESAPI.encoder().encodeForURL(cleanUserName);5.3 SQL注入5.3.1定义简单来说,注入往往是应用程序缺少对输入进行安全性检查所引起的,攻击者把一些包含指令的数据发送给解释器,解释器会把收到的数据转换成指令执行,注入漏洞十分普遍,通常能在SQL查询、LDAP查询、Xpath查询、OS命令、程序参数等中出现。5.3.2危害注入能导致数据丢失或数据破坏、缺乏可审计性或是拒绝服务。注入漏洞有时甚至能导致完全接管主机。5.3.3种类SQL注入、XPATH注入、LDAP

13、注入、OS命令注入等。5.3.4解决方法5.3.4.1.SQL注入实例String sqlString=SELECT * FROM users WHERE fullname=+form.getFullName()+AND password=+form.getPassword()+;正常:username=tony,password=123456SELECT * FROM users WHERE username=tony AND password=123456攻击:username=tony,password=OR1=1SELECT * FROM users WHERE username=to

14、nyANDpassword= OR 1=15.3.4.2.参数化查询预处理使用PreparedStatement()绑定变量下面的代码示例使用一个PreparedStatement,Java的一个参数化查询的执行情况,执行相同的数据库查询。String custname=request.getParameter(customerName);/ThisshouldREALLYbevalidatedtoo/performinputvalidationtodetectattacksString query=SELECT account_balance FROM user_dataWHERE user

15、_name=?;PreparedStatementpstmt=connection.prepareStatement(query);pstmt.setString(1,custname);ResultSetresults=pstmt.executeQuery();5.3.4.3.使用存储过程String custname=request.getParameter(customerName);/ThisshouldREALLYbevalidatedtryCallableStatementcs=connection.prepareCall(callsp_getAccountBalance(?);c

16、s.setString(1,custname);ResultSetresults=cs.executeQuery();/resultsethandlingcatch(SQLExceptionse)/logginganderrorhandling5.3.4.4.使用ESAPI/ESAPIversionofqueryCodecORACLE_CODEC=newOracleCodec();/wereusingoracleStringquery=SELECTnameFROMusersWHEREid=+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedU

17、serId)+AND date_created=+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedStartDate)+;myStmt=conn.createStatement(query);./executestatementandgetresults5.4恶意文件执行5.4.1定义恶意文件执行是一种能够威胁任何网站形式的漏洞,只要攻击者在具有引入(include)功能程式的参数中修改参数内容,WEB服务器便会引入恶意程序内容从而受到恶意文件执行漏洞攻击。5.4.2危害攻击者可利用恶意文件执行漏洞进行攻击取得WEB服务器控制权,进行不法利

18、益或获取经济利益。5.4.3解决方法5.4.3.1实例1验证输入,使用ESAPI验证上传文件名if(!ESAPI.validator().isValidFileName(upload,filename,allowedExtensions,false)throw new Validation UploadException(Upload only simple filenames withthefollowingextensions+allowedExtensions,Upload failedisValidFileName check);5.4.3.2实例2使用ESAPI检查上传文件大小Ser

19、vletFileUpload upload=newServletFileUpload(factory);upload.setSizeMax(maxBytes);5.5不安全的直接对象引用5.5.1定义所谓不安全的对象直接引用,即Insecure direct objectreferences,意指一个已经授权的用户,通过更改访问时的一个参数,从而访问到原本其并没有得到授权的对象。Web应用往往在生成Web页面时会用它的真实名字,且并不会对所有的目对象访问时来检查用户权限,所以这就造成不安全的对象直接引用的漏洞。我们看如下的一个示例,也许这样就更容易理解什么是不安全的对象直接引用。 攻击者发现他

20、自己的参数是6065,即?acct=6065; 他可以直接更改参数为6066,即?acct=6066; 这样他就可以直接看到6066用户的账户信息。5.5.2危害这种漏洞能损害参数所引用的所有数据。除非名字空间很稀疏,否则攻击者很容易访问该类型的所有数据。5.5.3解决方法5.5.3.1.案例1使用ESAPI的AccessReferenceMap实现使用非直接的对象引用MyObjectobj;/generateyourobjectCollectioncoll;/holdsobjectsfordisplayinUI/create ESAPI random access reference map

21、AccessReferenceMap map=newRandomAccessReferenceMap();/get indirect reference using direct reference as seed inputString indirectReference=map.addDirectReference(obj.getId();/set indirect reference for each object-requires your app object to have this methodbj.setIndirectReference(indirectReference);

22、/add object to display collectioncoll.add(obj);/store collection in request/session and forward to UI.5.5.3.2.案例2检查访问。来自不受信源所使用的所有直接对象引用都必须包含访问控制检测,这样才能确保用户对要求的对象有访问权限5.6跨站请求伪造5.6.1.定义跨站请求伪造,也被称成为oneclickattack或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内

23、的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。5.6.2.危害攻击者能让受害用户修改可以修改的任何数据,或者是执行允许使用的任何功能。5.6.3.解决方法第一步,新建CSRF令牌添加进用户每次登陆以及存储在session里,这种令牌至少对每个用户会话来说应该是唯一的,或者是对每个请求是唯一的。/this code is in the DefaultUser implementation of ESAPI/*This users CSRF token.

24、*/Private String csrfToken=resetCSRFToken();.Public String resetCSRFToken()csrfToken=ESAPI.randomizer().getRandomString(8,DefaultEncoder.CHAR_ALPHANUMERICS);returncsrfToken;第二步,令牌同样可以包含在URL中或作为一个URL参数记/隐藏字段。/from Utilitiles interfaceFinal static String CSRF_TOKEN_NAME=ctoken;/this code is from the D

25、efault Utilities implementation in ESAPIPublic String addCSRFToken(Stringhref)User user=ESAPI.authenticator().getCurrentUser();if(user.isAnonymous()returnhref;/if there are already parameters append with&,otherwise append with?String token=CSRF_TOKEN_NAME+=+user.getCSRFToken();return href.indexOf(?)

26、!=-1?href+&+token:href+?+token;.public StringgetCSRFToken()User user=ESAPI.authenticator().getCurrentUser();if(user=null) return null;return user.getCSRFToken();第三步,在服务器端检查提交令牌与用户会话对象令牌是否匹配。/this code is from the Defaul t Utilities implementation in ESAPIPublic void verifyCSRFToken(ServletRequest re

27、quest)throwsIntrusionExceptionUser user=ESAPI.authenticator().getCurrentUser();/check if user authenticated with this request-noCSRFprotection requiredif(request.getAttribute(user.getCSRFToken()!=null)return;String token=request.getParameter(CSRF_TOKEN_NAME);if(!user.getCSRFToken().equals(token)thro

28、w new IntrusionException(Authenticationfailed,Possibly forgeted request without proper CSRFtokendetected);第四步,在注销和会话超时,删除用户对象会话和会话销毁。/this code is in the DefaultUser implementation of ESAPIPublic void logout()ESAPI.Utilities().killCookie(ESAPI.currentResponse(),ESAPI.currentRequest(),Utilities.REMEM

29、BER_TOKEN_COOKIE_NAME);Session session=ESAPI.currentRequest().getSession(false);if(session!=null)removeSession(session);session.invalidate();ESAPI.Utilities().killCookie(ESAPI.currentRequest(),ESAPI.currentResponse(),JSESSIONID);loggedIn=false;logger.info(Logger.SECURITY_SUCCESS,Logout successful);E

30、SAPI.authenticator().setCurrentUser(User.ANONYMOUS);5.7信息泄露和错处理不当5.7.1定义应用程序常常产生错误信息并显示给使用者。很多时候,这些错误信息是非常有用的攻击,因为它们揭示实施细则或有用的开发信息利用的漏洞。5.7.2危害 泄露太多的细节(如错误堆栈跟踪信息、SQL语句等等); 登录失败后,通知用户是否用户ID或密码出错登录失败可能是由于ID或密码错误造成的。这为一个对关键资产发动蛮力攻击的攻击者提供重要信息。5.7.3解决方法5.7.3.1.案例1通过web.xml配置文件实现java.lang.Throwable/error.jsp5.7.3.2.案例2针对登录尝试的攻击,可以使用相同的报错信息,比如都是提示输入的用户名或者密码错误!。5.8残缺的认证和会话管理5.8.1定义与认证和会话管理相关的应用程序功能往往得不到正确实施,这就导致攻击者破坏密码、密匙、会话令牌或利用实施漏洞冒充其他用户身份。5

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1