1.线程的使用
不建议使用的方法:
new Thread() {
public void run() {
doPost(mContext, url, params, callback);
}}.start();
建议使用:
new Thread(new Runnable() {
@Override
public void run() {
doGet(url, callback);
}
}).start();
原因:
J2EE 标准禁止在某些环境下使用 Web 应用程序中的线程管理,因为此时使用线程管理非常容易出错。线程管理起来很困难,并且可能还会以不可预知的方式干扰应用程序容器。即使容器没有受到干扰, 线程管理通常还会导致各种难以发现的错误,如死锁、race condition 及其他同步错误等。
2.随机数的使用
不建议使用Random,因为Random的随机有一定的规律性。建议使用SecureRandom,因为SecureRandom的随机性更强一些。
3.try catch
catch里面不建议使用e.printStackTrace(),这样会打印出系统信息,导致系统信息泄漏,建议使用log打印e.getMessage()。最好加入finally块处理。
4.在对对象和字符串进行操作时,要进行非空的判断。
5.类继承Thread时,不建议重写run方法,建议重写start方法,
1)start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面 的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法 run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调 度其它线程。
2)run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
6.常量要加final修饰符
7.在上线的代码中只输出必要的日志,并过滤非法的字段。防止log注入,打印出错误的信息。
8.不用的字段和方法应该删除
9.流资源和数据库资源必须关闭。防止攻击者故意触发资源泄漏,通过耗尽资源发起攻击。
10.sql语句参数化操作时,防止sql注入,建议:
String sql = “delete from table1 where id=?”;
db.execSQL(sql,new String[]{“1111”});
11.在Android service中调用onStartCommand(Intent intent,int flags, int startId)方法时,intent需要判空,才可执行super.onStartCommand(Intent intent,int flags,int startId),如果intent为空,需要根据相应的情况返回不同的值:
1):START_STICKY: 如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
12.在WebView加载网页的时候,如果是静态网页,不需要与本地通过js交互的,webiew的js属性不要设置为true,防止js注入。
13.
备注:可能遇到的问题的翻译
Poor Logging Practice:日志技术欠佳
Use of a System Output Stream:使用一个系统的输出流
System Information Leak:系统信息泄漏
Poor Error Handling: Overly Broad Catch:缺少错误处理:过度捕捉
Poor Error Handling: Overly Broad Throws:缺少错误处理:过于宽泛的投入
Trust Boundary Violation:违反了管理界限(范围)
HTTP Response Splitting:HTTP相应破裂
Race Condition: Singleton Member Field:竞争条件:独立的成员字段
Missing Check against Null:丢失了反对null的检查
J2EE Bad Practices: Leftover Debug Code:J2EE 不好的做法:残余调试代码
Missing XML Validation:丢失文档的有效性验证
Null Dereference:空引用
Poor Style: Value Never Read:缺少形式,值未读
Code Correctness: Erroneous String Compare:代码的正确性:错误的字符串比较
Unreleased Resource: Streams :释放资源:流
Poor Style: Redundant Initialization:缺少的形式:冗余初始化
Insecure Randomness :不安全的随机性
Dead Code: Expression is Always true:不用的(无效的,失效的)代码:表达始终是true的:
J2EE Bad Practices: System.exit :J2EE不好的做法:系统退出
Redundant Null Check:检查冗余无效
System Information Leak: Missing Catch Block:系统信息泄漏:失踪块
Dead Code: Unused Method:不用的(无效的,失效的)代码:未使用的方法
Path Manipulation:路径控制
Dead Code: Expression is Always false:不用的(无效的,失效的)代码:表达始终是false
Dead Code: Unused Field:不用的(无效的,失效的)代码:未使用的领域:
Poor Error Handling: Empty Catch Block:缺少错误处理:空块
SQL Injection :SQL注入
JSON Injection :JSON注入
Unchecked Return Value:未检查返回值
参考链接:http://cwe.mitre.org/