文档介绍:.
. >
软件平安开发编码规
代码编写
开发人员应保证工程中不存在无用的资源〔如以获取这些成员的访问权的方式。防止这类攻击的方式有两种:
。
...
=Package#1 [,Package#2,...,Package#n]
...
当检测到代码试图在包定义新类时,类装载器的defineClass方法会抛出异常,除非代码被赋予以下权限:
...
RuntimePermission("defineClassInPackage."+package)
...
另一种方式是通过将包放到封闭的JAR〔sealed Jar〕文件里。
〔./j2se/sdk/*tensions/〕
通过使用这种技巧,代码无法获得扩展包的权限,。
防止包访问:可以通过限制包访问但同时仅赋予特定代码访问权限防止不可信任代码对包成员的访问。通过向文件中参加如下文字可以到达这一目的:
...
=Package#1 [,Package#2,...,Package#n]
...
当检测到代码试图访问上述包中的类时,类加载器的loadClass方法会抛出异常,除非代码被赋予以下权限:
...
RuntimePermission("defineClassInPackage."+package)
...
尽可能使对象不可变〔immutable〕
.
. >
尽可能使对象不可变。如果对象必须改变,使得它们可以克隆并在方法调用时返回副本。如果方法调用的返回对象是数组、向量或哈希表等,牢记这些对象并非不可变,调用者可以修改这些对象的容并导致平安漏洞。此外,不可变的对象因为不用上锁所以能够提高并发性。
不要返回包含敏感数据的部数组引用。
这个不可变惯例的变型,在这儿提出是因为是个常见错误。即使数组中包含不可变的对象比方说是字符串,也要返回一个副本,这样调用者不能修改数组中包含的到底是哪个字符串。在方法调用返回时,返回数据的拷贝而不要返回数组。
不要直接在用户提供的数组里存储
这是不可变惯例的另一个变型。构造器和方法可以承受对象数组,比方说PubicKey数组,这个数据存储到部之前应当克隆,并保存克隆后的数据,而不是直接将数组引用赋给同样类型的部变量。如果缺少这个步骤,在使用了有问题的构造器创立了对象后,用户对外部数组所作的任何修改都将更改对象的部状态,尽管对象应该是不可变的。
序列化
对象在序列化后、反序列化之前,都不在Java运行时环境的控制之下,也因此不在Java平台提供的平安控制围。
在实现接口Serializable时务必将以下事宜牢记在心: