安全编码规范文档格式.docx
- 文档编号:6023113
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:23
- 大小:22.57KB
安全编码规范文档格式.docx
《安全编码规范文档格式.docx》由会员分享,可在线阅读,更多相关《安全编码规范文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
ResultSetrs=stmt.executeQuery();
1.1.2避免XML注入
通过StringBulider或StringBuffer拼接XML文件时,需对输入数据进行合法性校验。
对数量quantity进行合法性校验,控制只能传入0-9的数字:
if(!
Pattern.matches("
[0-9]+"
quantity)){
//Formatviolation
}
StringxmlString="
<
item>
\n<
description>
Widget<
/description>
\n"
+
"
price>
500<
/price>
quantity>
+quantity+"
/quantity>
/item>
outStream.write(xmlString.getBytes());
outStream.flush();
1.1.3避免跨站点脚本(XSS)
对产生跨站的参数进行严格过滤,禁止传入<
SCRIPT>
标签
//定义需过滤的字段串<
script>
Strings="
\uFE64"
+"
script"
\uFE65"
//过滤字符串标准化
s=Normalizer.normalize(s,Form.NFKC);
//使用正则表达式匹配inputStr是否存在<
Patternpattern=Ppile(inputStr);
Matchermatcher=pattern.matcher(s);
if(matcher.find()){
//Foundblacklistedtag
thrownewIllegalStateException();
}else{
//...
}
1.2声明和初始化
1.2.1避免类初始化的相互依赖
例:
错误的写法:
publicclassCycle{
privatefinalintbalance;
privatestaticfinalCyclec=newCycle();
privatestaticfinalintdeposit=(int)(Math.random()*100);
//Randomdeposit
publicCycle(){
balance=deposit-10;
//Subtractprocessingfee
publicstaticvoidmain(String[]args){
System.out.println("
Theaccountbalanceis:
+c.balance);
类加载时初始化指向Cycle类的静态变量c,而类Cycle的无参构造方法又依赖静态变量deposit,导致无法预期的结果。
正确的写法:
//Insertedafterinitializationofrequiredfields
1.3表达式
1.3.1不可忽略方法的返回值
忽略方法的放回值可能会导致无法预料的结果。
publicvoiddeleteFile(){
FilesomeFile=newFile("
someFileName.txt"
);
someFile.delete();
if(!
someFile.delete()){
//handlefailuretodeletethefile
1.3.2不要引用空指针
当一个变量指向一个NULL值,使用这个变量的时候又没有检查,这时会导致。
NullPointerException。
在使用变量前一定要做是否为NULL值的校验。
1.3.3使用Arrays.equals()来比较数组的内容
数组没有覆盖的Object.equals()方法,调用Object.equals()方法实际上是比较数组的引用,而不是他们的内容。
程序必须使用两个参数Arrays.equals()方法来比较两个数组的内容
publicvoidarrayEqualsExample(){
int[]arr1=newint[20];
//initializedto0
int[]arr2=newint[20];
Arrays.equals(arr1,arr2);
//true
1.4数字类型和操作
1.4.1防止整数溢出
使用java.lang.Number.BigInteger类进行整数运算,防止整数溢出。
publicclassBigIntegerUtil{
privatestaticfinalBigIntegerbigMaxInt=BigInteger.valueOf(Integer.MAX_VALUE);
privatestaticfinalBigIntegerbigMinInt=BigInteger.valueOf(Integer.MIN_VALUE);
publicstaticBigIntegerintRangeCheck(BigIntegerval)throwsArithmeticException{
if(pareTo(bigMaxInt)==1||pareTo(bigMinInt)==-1){
thrownewArithmeticException("
Integeroverflow"
returnval;
publicstaticintaddInt(intv1,intv2)throwsArithmeticException{
BigIntegerb1=BigInteger.valueOf(v1);
BigIntegerb2=BigInteger.valueOf(v2);
BigIntegerres=intRangeCheck(b1.add(b2));
returnres.intValue();
publicstaticintsubInt(intv1,intv2)throwsArithmeticException{
BigIntegerres=intRangeCheck(b1.subtract(b2));
publicstaticintmultiplyInt(intv1,intv2)throwsArithmeticException{
BigIntegerres=intRangeCheck(b1.multiply(b2));
publicstaticintdivideInt(intv1,intv2)throwsArithmeticException{
BigIntegerres=intRangeCheck(b1.divide(b2));
1.4.2避免除法和取模运算分母为零
要避免因为分母为零而导致除法和取模运算出现异常。
if(num2==0){
//handleerror
result1=num1/num2;
result2=num1%num2;
1.5类和方法操作
1.5.1数据成员声明为私有,提供可访问的包装方法
攻击者可以用意想不到的方式操纵public或protected的数据成员,所以需要将数据成员为private,对外提供可控的包装方法访问数据成员。
1.5.2敏感类不允许复制
包含私人的,机密或其他敏感数据的类是不允许被复制的,解决的方法有两种:
1、类声明为final
finalclassSensitiveClass{
2、Clone方法抛出CloneNotSupportedException异常
classSensitiveClass{
publicfinalSensitiveClassclone()throwsCloneNotSupportedException{
thrownewCloneNotSupportedException();
1.5.3比较类的正确做法
如果由同一个类装载器装载,它们具有相同的完全限定名称,则它们是两个相同的类。
不正确写法:
//Determinewhetherobjectauthhasrequired/expectedclassobject
if(auth.getClass().getName().equals(
com.application.auth.DefaultAuthenticationHandler"
)){
正确写法:
//Determinewhetherobjectauthhasrequired/expectedclassname
if(auth.getClass()==com.application.auth.DefaultAuthenticationHandler.class){
1.5.4不要硬编码敏感信息
硬编码的敏感信息,如密码,服务器IP地址和加密密钥,可能会泄露给攻击者。
敏感信息均必须存在在配置文件或数据库中。
1.5.5验证方法参数
验证方法的参数,可确保操作方法的参数产生有效的结果。
不验证方法的参数可能会导致不正确的计算,运行时异常,违反类的不变量,对象的状态不一致。
对于跨信任边界接收参数的方法,必须进行参数合法性校验
privateObjectmyState=null;
//对于修改myState方法的入参,进行非空和合法性校验
voidsetState(Objectstate){
if(state==null){
//Handlenullstate
if(isInvalidState(state)){
//Handleinvalidstate
myState=state;
1.5.6不要使用过时、陈旧或低效的方法
在程序代码中使用过时的、陈旧的或低效的类或方法可能会导致错误的行为。
1.5.7数组引用问题
某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。
即使数组对象本身是不可改变的,也可以在数组对象以外操作数组的内容,这种操作将反映在返回该数组的对象中。
如果该方法返回可改变的对象,外部实体可以改变在那个类中声明的public变量,这种改变将反映在实际对象中。
不正确的写法:
publicclassXXX{
privateString[]xxxx;
publicString[]getXXX(){
returnxxxx;
Stringtemp[]=Arrays.copyof(…);
//或其他数组复制方法
returntemp;
1.5.8不要产生内存泄露
垃圾收集器只收集不可达的对象,因此,存在未使用的可到达的对象,仍然表示内存管理不善。
过度的内存泄漏可能会导致内存耗尽,拒绝服务(DoS)。
1.6异常处理
1.6.1不要忽略捕获的异常
对于捕获的异常要进行相应的处理,不能忽略已捕获的异常
classFooimplementsRunnable{
publicvoidrun(){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
//此处InterruptedException被忽略
Thread.currentThread().interrupt();
//Resetinterruptedstatus
1.6.2不允许暴露异常的敏感信息
没有过滤敏感信息的异常堆栈往往会导致信息泄漏,
try{
FileInputStreamfis=
newFileInputStream(System.getenv("
APPDATA"
)+args[0]);
}catch(FileNotFoundExceptione){
//Logtheexception
thrownewIOException("
Unabletoretrievefile"
e);
classExceptionExample{
Filefile=null;
file=newFile(System.getenv("
)+
args[0]).getCanonicalFile();
file.getPath().startsWith("
c:
\\homepath"
log.error("
Invalidfile"
return;
}catch(IOExceptionx){
FileInputStreamfis=newFileInputStream(file);
}catch(FileNotFoundExceptionx){
log.error("
1.6.3不允许抛出RuntimeException,Exception,Throwable
booleanisCapitalized(Strings){
if(s==null){
thrownewRuntimeException("
NullString"
privatevoiddoSomething()throwsException{
//...
thrownewNullPointerException();
privatevoiddoSomething()throwsIOException{
1.6.4不要捕获NullPointerException或其他父类异常
booleanisName(Strings){
Stringnames[]=s.split("
if(names.length!
=2){
returnfalse;
return(isCapitalized(names[0])&
&
isCapitalized(names[1]));
}catch(NullPointerExceptione){
booleanisName(Strings)/*throwsNullPointerException*/{
1.7多线程编程
1.7.1确保共享变量的可见性
对于共享变量,要确保一个线程对它的改动对其他线程是可见的。
线程可能会看到一个陈旧的共享变量的值。
为了共享变量是最新的,可以将变量声明为volatile或同步读取和写入操作。
将共享变量声明为volatile:
finalclassControlledStopimplementsRunnable{
privatevolatilebooleandone=false;
@Overridepublicvoidrun(){
while(!
done){
Thread.currentThread().sleep(1000);
//Dosomething
}catch(InterruptedExceptionie){
}
publicvoidshutdown(){
done=true;
同步读取和写入操作:
privatebooleandone=false;
isDone()){
publicsynchronizedbooleanisDone(){
returndone;
publicsynchronizedvoidshutdown(){
1.7.2确保共享变量的操作是原子的
除了要确保共享变量的更新对其他线程可见的,还需要确保对共享变量的操作是原子的,这时将共享变量声明为volatile往往是不够的。
需要使用同步机制或Lock
finalclassFlag{
privatevolatilebooleanflag=true;
publicsynchronizedvoidtoggle(){
flag^=true;
//Sameasflag=!
flag;
publicbooleangetFlag(){
returnflag;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 安全 编码 规范