首页 (安全生产)J编写过程中安全问题解决指南

(安全生产)J编写过程中安全问题解决指南

举报
开通vip

(安全生产)J编写过程中安全问题解决指南在本文中,我们议论了应付13种不一样静态裸露的技巧。对于每种裸露,我们解说了不办理这些安全性问题所造成的影响。我们还为您介绍了一些准则,要开发不受这些静态安全性裸露威迫的、强健且安全的Java应用程序,您应当依据这些准则。一有适合的机遇,我们就供给代码样本(既有裸露的代码也有无裸露的代码)。应付高严重性裸露的技巧请依据以下建议以防止高严重性静态安全性裸露:限制对变量的接见让每个类和方法都成为final,除非有足够的原因不这样做不要依靠包作用域使类不行克隆使类不行序列化使类不行逆序列化防止硬编码敏感数据查找歹意代码限...

(安全生产)J编写过程中安全问题解决指南
在本文中,我们议论了应付13种不一样静态裸露的技巧。对于每种裸露,我们解说了不办理这些安全性问题所造成的影响。我们还为您介绍了一些准则,要开发不受这些静态安全性裸露威迫的、强健且安全的Java应用程序,您应当依据这些准则。一有适合的机遇,我们就供给代码样本(既有裸露的代码也有无裸露的代码)。应付高严重性裸露的技巧请依据以下建议以防止高严重性静态安全性裸露:限制对变量的接见让每个类和方法都成为final,除非有足够的原因不这样做不要依靠包作用域使类不行克隆使类不行序列化使类不行逆序列化防止硬编码敏感数据查找歹意代码限制对变量的接见假如将变量申明为public,那么外面代码就能够操作该变量。这可能会致使安全性裸露。影响假如实例变量为public,那么就能够在类实例上直接接见和操作该实例变量。将实例变量申明为protected其实不必定能解决这一问题:固然不行能直接在类实例基础上接见这样的变量,但仍旧能够从派生类接见这个变量。 清单 安全隐患排查清单下载最新工程量清单计量规则下载程序清单下载家私清单下载送货清单下载 1演示了带有public变量的代码,由于变量为public的,因此它裸露了。清单1.带有public变量的代码classTest{publicintid;protectedStringname;Test(){id=1;name="helloworld";}//code}publicclassMyClassextendsTest{publicvoidmethodIllegalSet(Stringname){this.name=name;//thisshouldnotbeallowed}publicstaticvoidmain(String[]args){Testobj=newTest();obj.id=123;//thisshouldnotbeallowedMyClassmc=newMyClass();mc.methodIllegalSet("IllegalSetValue");}}建议一般来说,应当使用取值方法而不是public变量。依据详细问题详细对待的原则,在确立哪些变量特别重要因此应当申明为private时,请将编码的方便程度及成本同安全性需要加以比较。清单2演示了以以下方式来使之安全的代码:清单2.不带有public变量的代码classTest{privateintid;privateStringname;Test(){id=1;name="helloworld";}publicvoidsetId(intid){this.id=id;}publicvoidsetName(Stringname){this.name=name;}publicintgetId(){returnid;}publicStringgetName(){returnname;}}让每个类和方法都为final不一样意扩展的类和方法应当申明为final。这样做防备了系统外的代码扩展类并改正类的行为。影响只是将类申明为非public其实不可以防备攻击者扩展类,由于仍旧能够从它自己的包内接见该类。建议让每个类和方法都成为final,除非有足够的原因不这样做。按此建议,我们要求您放弃可扩展性,固然它是使用诸如Java语言之类的面向对象语言的主要长处之一。在试图供给安全性时,可扩展性却成了您的仇敌;可扩展性只会为攻击者供给更多给您带来麻烦的方法。不要依靠包作用域没有显式地标明为public、private或protected的类、方法和变量在它们自己的包内是可接见的。影响假如Java包不是关闭的,那么攻击者就能够向包内引入新类并使用该新类来接见您想保护的内容。诸如java.lang之类的一些包缺省是关闭的,一些JVM也让您关闭自己的包。但是,您最好假定包是不关闭的。建议从软件工程看法来看,包作用域拥有重要意义,由于它能够阻挡对您想隐蔽的内容进行有时的、无心中的接见。但不要依靠它来获得安全性。应当将类、方法和变量显式标明为public、private或protected中适合您特定需求的那种。使类不行克隆克隆同意绕过结构器而轻易地复制类实例。影响即便您没有存心使类可克隆,外面源仍旧能够定义您的类的子类,并使该子类实现java.lang.Cloneable。这就让攻击者创立了您的类的新实例。拷贝现有对象的内存映象生成了新的实例;固然这样做有时是生成新对象的可接受方法,可是大部分时候是不行接受的。清单3说了然由于可克隆而裸露的代码:清单3.可克隆代码classMyClass{privateintid;privateStringname;publicMyClass(){id=1;name="HaryPorter";}publicMyClass(intid,Stringname){this.id=id;this.name=name;}publicvoiddisplay(){System.out.println("Id="+id+""+"Name="+name);}}//hackerscodetoclonetheuserclasspublicclassHackerextendsMyClassimplementsCloneable{publicstaticvoidmain(String[]args){Hackerhack=newHacker();try{MyClasso=(MyClass)hack.clone();o.display();}catch(CloneNotSupportedExceptione){e.printStackTrace();}}}建议要防备类被克隆,能够将清单4中所示的方法增添到您的类中:清单4.使您的代码不行克隆publicfinalObjectclone()throwsjava.lang.CloneNotSupportedException{thrownewjava.lang.CloneNotSupportedException();}假如想让您的类可克隆并且您已经考虑了这一选择的结果,那么您仍旧能够保护您的类。要做到这一点,请在您的类中定义一个为final的克隆方法,并让它依靠于您的一个超类中的一个非final克隆方法,如清单5中所示:清单5.以安全的方式使您的代码可克隆publicfinalObjectclone()throwsjava.lang.CloneNotSupportedException{super.clone();}类中出现clone()方法防备攻击者从头定义您的clone方法。使类不行序列化序列化同意将类实例中的数据保留在外面文件中。闯进代码能够克隆或复制实例,而后对它进行序列化。影响序列化是令人担忧的,由于它同意外面源获得对您的对象的内部状态的控制。这一外面源能够将您的对象之一序列化成攻击者随后能够读取的字节数组,这使得攻击者能够完好审察您的对象的内部状态,包含您标记为private的任何字段。它也同意攻击者接见您引用的任何对象的内部状态。建议要防备类中的对象被序列化,请在类中定义清单6中的writeObject()方法:清单6.防备对象序列化privatefinalvoidwriteObject(ObjectOutputStreamout)throwsjava.io.NotSerializableException{thrownewjava.io.NotSerializableException("Thisobjectcannotbeserialized");}经过将writeObject()方法申明为final,防备了攻击者覆盖该方法。使类不行逆序列化经过使用逆序列化,攻击者能够用外面数据或字节流来实例化类。影响不论类能否能够序列化,都能够对它进行逆序列化。外面源能够创立逆序列化成类实例的字节序列。这类可能为您带来了大批风险,由于您不可以控制逆序列化对象的状态。请将逆序列化作为您的对象的另一种公共结构器?一种您没法控制的结构器。建议要防备对对象的逆序列化,应当在您的类中定义清单7中的readObject()方法:清单7.防备对象逆序列化privatefinalvoidreadObject(ObjectInputStreamin)throwsjava.io.NotSerializableException{thrownewjava.io.NotSerializableException("Thisobjectcannotbedeserialized");}经过将该方法申明为final,防备了攻击者覆盖该方法。防止硬编码敏感数据您可能会试试将诸如加密密钥之类的奥密寄存在您的应用程序或库的代码。对于你们开发人员来说,这样做往常会把事情变得更简单。影响任何运转您的代码的人都能够完好接见以这类方法储存的奥密。没有什么东西能够防备居心叵测的程序员或虚构机窥伺您的代码并认识其奥密。建议能够以一种只可被您解密的方式将奥密储存在您代码中。在这类情况下,奥密只在于您的代码所使用的算法。这样做没有多大缺点,但不要洋洋喜悦,认为这样做供给了坚固的保护。您能够遮盖您的源代码或字节码?也就是,以一种为认识密一定知道加密 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 的方法对源代码或字节码进行加密?但攻击者极有可能能够推测出加密格式,对遮盖的代码进行逆向工程进而揭穿其奥密。这一问题的一种可能解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 是:将敏感数据保留在属性文件中,不论什么时候需要这些数据,都能够从该文件读取。假如数据极其敏感,那么在接见属性文件时,您的应用程序应当使用一些加密/解密技术。查找歹意代码从事某个项目的某个居心叵测的开发人员可能成心引入易受攻击的代码,打算往后利用它。这样的代码在初始化时可能会启动一个后台进度,该进度能够为闯进者开后门。它也可以改正一些敏感数据。这样的歹意代码有三类:类中的main方法定义过且未使用的方法说明中的死代码影响进口点程序可能很危险并且有歹意。往常,Java开发人员常常在其类中编写main()方法,这有助于测试单个类的功能。当类从测试转移到生产环境时,带有main()方法的类就成为了对应用程序的潜伏威迫,由于闯进者将它们用作进口点。请检查代码中能否有未使用的方法出现。这些方法在测试时期将会经过全部的安全检查,由于在代码中不调用它们?但它们可能含有硬编码在它们内部的敏感数据(固然是测试数据)。引入一小段代码的攻击者随后可能调用这样的方法。防止最后应用程序中的死代码(说明内的代码)。假如闯进者去掉了对这样的代码的说明,那么代码可能会影响系统的功能性。能够在清单8中看到全部三种种类的歹意代码的示例:清单8.潜伏歹意的Java代码publicvoidunusedMethod(){codewrittentoharmthesystem}publicvoidusedMethod(){//unusedMethod();//codeincommentputwithbadintentions,//mightaffectthesystemifuncommentedintx=100;x=x+10;//Codeincomment,mightaffectthe//functionalityofthesystemifuncommented}建议应当将(除启动应用程序的main()方法以外的)main()方法、未使用的方法以及死代码从应用程序代码中除掉。在软件交托使用以前,主要开发人员应当对敏感觉用程序进行一次全面的代码评审。应当使用“Stub”或“dummy”类取代main()方法以测试应用程序的功能。应付中等严重性裸露的技巧请依据以下建议以防止中等严重性静态安全性裸露:不要依靠初始化不要经过名称来比较类不要使用内部类不要依靠初始化您能够不运转结构器而分派对象。这些对象使用起来不安全,由于它们不是经过结构器初始化的。影响在初始化时考证对象保证了数据的完好性。比如,请想象为客户创立新帐户的Account对象。只有在Account期初余额大于0时,才能够开设新帐户。能够在结构器里履行这样的考证。有些人未履行结构器而创立Account对象,他可能创立了一个拥有一些负值的新帐户,这样会使系统不一致,简单遇到进一步的干涉。建议在使用对象以前,请检核对象的初始化过程。要做到这一点,每个类都应当有一个在构造器中设置的私有布尔标记,如清单9中的类所示。在每个非static方法中,代码在任何进一步履行以前都应当检查该标记的值。假如该标记的值为true,那么控制应当进一步继续;不然,控制应当抛出一个例外并停止履行。那些从结构器调用的方法将不会检查初始化的变量,由于在调用方法时没有设置标记。由于这些方法其实不检查标记,因此应当将它们申明为private以防备用户直接接见它们。清单9.使用布尔标记以检查初始化过程publicclassMyClass{privatebooleaninitialized=false;//OthervariablespublicMyClass(){//variableinitializationmethod1();initialized=true;}privatevoidmethod1(){//noneedtocheckforinitializationvariable//code}publicvoidmethod2(){try{if(initialized==true){//proceedwiththebusinesslogic}else{thrownewException("IllegalStateOftheobject");}}catch(Exceptione){e.printStackTrace();}}}假如对象由逆序列化进行初始化,那么上边议论的考证体制将难以见效,由于在该过程中其实不调用结构器。在这类状况下,类应当实现ObjectInputValidation接口:清单10.实现ObjectInputValidationinterfacejava.io.ObjectInputValidation{publicvoidvalidateObject()throwsInvalidObjectException;}全部考证都应当在validateObject()方法中履行。对象还一定调用ObjectInputStream.RegisterValidation()方法认为逆序列化对象以后的考证进行注册。RegisterValidation()的第一个参数是实现validateObject()的对象,往常是对对象自己的引用。注:任何实现validateObject()的对象都可能充任对象考证器,但对象往常考证它自己对其余对象的引用。RegisterValidation()的第二个参数是一个确立回调次序的整数优先级,优先级数字大的比优先级数字小的先回调。同一优先级内的回调次序则不确立。当对象已逆序列化时,ObjectInputStream依据从高到低的优先级次序调用每个已注册对象上的validateObject()。不要经过名称来比较类有时,您可能需要比较两个对象的类,以确立它们能否同样;或许,您可能想看看某个对象是不是某个特定类的实例。由于JVM可能包含多个拥有同样名称的类(拥有同样名称但却在不一样包内的类),因此您不该当依据名称来比较类。影响假如依据名称来比较类,您可能无心中将您不希望授与他人的权益授与了闯进者的类,由于闯进者能够定义与您的类同名的类。比如,告假定您想确立某个对象是不是类com.bar.Foo的实例。清单11演示了达成这一任务的错误方法:清单11.比较类的错误方法if(obj.getClass().getName().equals("Foo"))//Wrong!objectsclassisnamedFoo}else{//object'sclasshassomeothername}建议在那些非得依据名称来比较类的状况下,您一定分外当心,一定保证使用了目前类的ClassLoader的目前名称空间,如清单12中所示:清单12.比较类的更好方法if(obj.getClass()==this.getClassLoader().loadClass("com.bar.Foo")){//object'sclassisequalto//theclassthatthisclasscalls"com.bar.Foo"}else{object'sclassisnotequaltotheclassthatthisclasscalls"com.bar.Foo"}对象但是,比较类的更好方法是直接比较类对象看它们能否相等。比如,假如您想确立两个a和b能否属同一个类,那么您就应当使用清单13中的代码:清单13.直接比较对象来看它们能否相等if(a.getClass()==b.getClass()){objectshavethesameclass}else{objectshavedifferentclasses}尽可能少用直接名称比较。不要使用内部类Java字节码没有内部类的看法,由于编译器将内部类变换成了一般类,而假如没有将内部类申明为private,则同一个包内的任何代码恰巧能接见该一般类。影响由于有这一特征,因此包内的歹意代码能够接见这些内部类。假如内部类能够接见括起外面类的字段,那么状况会变得更糟。可能已经将这些字段申明为private,这样内部类就被变换成了独立类,但当内部类接见外面类的字段时,编译器就将这些字段从专用(private)的变成在包(package)的作用域内有效的。内部类裸露了已经够糟糕的了,但更糟糕的是编译器使您将某些字段成为private的行为成为白费。建议假如能够不使用内部类就不要使用内部类。应付低严重性裸露的技巧请依据以下建议以防止低严重性静态安全性裸露:防止返回可变对象检查本机方法防止返回可变对象Java方法返回对象引用的副本。假如实质对象是可改变的,那么使用这样一个引用调用程序可能会改变它的内容,往常这是我们所不希看见到的。影响请考虑这个示例:某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。即便数组对象自己是不行改变的,也能够在数组对象以外操作数组的内容,这类操作将反应在返回该数组的对象中。假如该方法返回可改变的对象,那么事情会变得更糟;外面实体能够改变在那个类中申明的public变量,这类改变将反应在实质对象中。清单14演示了柔弱性。getExposedObj()方法返回了Exposed对象的引用副本,该对象是可变的:清单14.返回可变对象的引用副本classExposed{privateintid;privateStringname;publicExposed(){}publicExposed(intid,Stringname){this.id=id;this.name=name;}publicintgetId(){returnid;}publicStringgetName(){returnname;}publicvoidsetId(intid){this.id=id;}publicvoidsetName(Stringname){this.name=name;}publicvoiddisplay(){System.out.println("Id="+id+"Name="+name);}}publicclassExp12{privateExposedexposedObj=newExposed(1,"HarryPorter");publicExposedgetExposedObj(){returnexposedObj;//returnsareferencetotheobject.}publicstaticvoidmain(String[]args){Exp12exp12=newExp12();exp12.getExposedObj().display();Exposedexposed=exp12.getExposedObj();exposed.setId(10);exposed.setName("Hacker");exp12.getExposedObj().display();}}建议假如方法返回可改变的对象,但又不希望调用程序改变该对象,请改正该方法使之不返回实质对象而是返回它的副本或克隆。要更正清单14中的代码,请让它返回Exposed对象的副本,如清单15中所示:清单15.返回可变对象的副本publicExposedgetExposedObj(){returnnewExposed(exposedObj.getId(),exposedObj.getName());}或许,您的代码也能够返回Exposed对象的克隆。检查本机方法本机方法是一种Java方法,其实现是用另一种编程语言编写的,如C或C++。有些开发人员实现本机方法,这是由于Java语言即便使用即时(just-in-time)编译器也比很多编译过的语言要慢。其余人需要使用本机代码是为了在JVM以外实现特定于平台的功能。影响使用本机代码时,请当心,由于对这些代码进行考证是不行能的,并且本机代码可能潜在地同意applet绕过往常的安全性管理器(SecurityManager)和Java对设施接见的控制。建议假如非得使用本机方法,那么请检查这些方法以确立:它们返回什么它们获得什么作为参数它们能否绕过安全性检查它们是不是public、private等等它们能否含有绕过包界限进而绕过包保护的方法调用结束语编写安全Java代码是十分困难的,但本文描绘了一些可行的实践来帮您编写安全Java代码。这些建议其实不可以解决您的全部安全性问题,但它们将减少裸露数量。最正确软件安全性实践能够帮助保证软件正常运转。安全至关重要和高靠谱系统设计者老是花销大批精力来剖析和追踪软件行为。只有经过将安全性作为至关紧急的系统特征来对待?并且从一开始就将它建立到应用程序中,我们才能够防止亡羊补牢似的、修修理补的安全性方法。参照资料请经过单击文章顶部或底部的议论来参加本文的论坛。认识对于Java安全性API的更多知识。developerWorks安全专题上往常含有相关计算机安全性的优异资源。LarryKoved、AnthonyJ.Nadalin、DonNeal和TimLawson合作编写的“TheevolutionofJavasecurity”(developerWorks,1998年)对Java语言的安全性模型初期开发进行了深入商讨。SingLi在他的Java安全性系列文章(由两部分构成的)(developerWorks,2001年2月)中向开发人员显示:只管社区可能不得不从头考虑Java2中的安全性设计,仍是出现了只对开发人员有帮助,能够知足他们的需求的一致的进展:第一部分第二部分JohnViega、TomMutdosch、GaryMcGraw和EdFelten合著的“StaticallyscanningJavacodeforsecurityvulnerabilities”(IEEESoftware,2000年9月)介绍了一种Java工具,能够使用该工具来检查您的Java代码中的安全性破绽。G.McGraw和E.Felten合作编写的SecuringJava:GettingDowntoBusinesswithMobileCode(JohnWiley和Sons,1998年)深入涵盖了Java安全性。(文档是PDF格式的。)按期检查IBM研究Java安全页面以便IBM在安全性领域的创新有重要发展时能够追踪这一创新。假如您的Java代码运转在S/390系统上,那么您将需要查阅S/390Java安全页面以获得额外的信息。
本文档为【(安全生产)J编写过程中安全问题解决指南】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
花双韵芝
本人从事钳工工作多年,经验丰富。
格式:doc
大小:84KB
软件:Word
页数:18
分类:
上传时间:2023-03-03
浏览量:1