安全编码规范Word下载.docx
《安全编码规范Word下载.docx》由会员分享,可在线阅读,更多相关《安全编码规范Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
批准人
1安全编码规范
1.1输入验证和数据合法性校验
程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题。
1.1.1避免SQL注入
使用PreparedStatement预编译SQL,解决SQL注入问题,传递给PreparedStatement对象的参数可以被强制进行类型转换,确保在插入或查询数据时与底层的数据库格式匹配。
StringsqlString="
select*fromdb_userwhereusername=?
andpassword=?
"
;
PreparedStatementstmt=connection.prepareStatement(sqlString);
stmt.setString(1,username);
stmt.setString(2,pwd);
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敏感类不允许复制
包含私人的,机密或其他敏感数据的类是不允许被复制