1、批准人1 安全编码规范1.1 输入验证和数据合法性校验程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题。1.1.1 避免SQL注入使用PreparedStatement预编译SQL,解决SQL注入问题,传递给PreparedStatement对象的参数可以被强制进行类型转换,确保在插入或查询数据时与底层的数据库格式匹配。String sqlString = select * from db_user where username= and password=;PreparedStatement stmt = (sqlStri
2、ng);(1, username);(2, pwd);ResultSet rs = ();1.1.2 避免XML注入通过StringBulider 或 StringBuffer 拼接XML文件时,需对输入数据进行合法性校验。对数量quantity 进行合法性校验,控制只能传入0-9的数字:if (!(0-9+, quantity) .1.2 声明和初始化1.2.1 避免类初始化的相互依赖例:错误的写法:public class Cycle private final int balance; private static final Cycle c = new Cycle(); private
3、 static final int deposit = (int) () * 100); equals()方法,调用Object. equals()方法实际上是比较数组的引用,而不是他们的内容。程序必须使用两个参数()方法来比较两个数组的内容public void arrayEqualsExample() int arr1 = new int20;1、 Clone 方法抛出CloneNotSupportedException异常class SensitiveClass public final SensitiveClass clone() throws CloneNotSupportedExc
4、eption throw new CloneNotSupportedException(); 1.2.2 比较类的正确做法如果由同一个类装载器装载,它们具有相同的完全限定名称,则它们是两个相同的类。不正确写法:etName().equals( ) 正确写法:.1.2.3 不要硬编码敏感信息硬编码的敏感信息,如密码,服务器IP地址和加密密钥,可能会泄露给攻击者。敏感信息均必须存在在配置文件或数据库中。1.2.4 验证方法参数验证方法的参数,可确保操作方法的参数产生有效的结果。不验证方法的参数可能会导致不正确的计算,运行时异常,违反类的不变量,对象的状态不一致。对于跨信任边界接收参数的方法,必须进
5、行参数合法性校验private Object myState = null;nterrupt(); etCanonicalFile(); if (!().startsWith(c:homepath (Invalid file); return; catch (IOException x) try FileInputStream fis = new FileInputStream(file); catch (FileNotFoundException x) (1.2.5 不允许抛出RuntimeException, Exception,Throwable不正确的写法:boolean isCapi
6、talized(String s) if (s = null) throw new RuntimeException(Null Stringprivate void doSomething() throws Exception throw new NullPointerException();private void doSomething() throws IOException 1.2.6 不要捕获NullPointerException或其他父类异常boolean isName(String s) String names = ( if != 2) return false; retur
7、n (isCapitalized(names0) & isCapitalized(names1); catch (NullPointerException e) 正确的写法:boolean isName(String s) /* throws NullPointerException */ 1.3 多线程编程1.3.1 确保共享变量的可见性对于共享变量,要确保一个线程对它的改动对其他线程是可见的。线程可能会看到一个陈旧的共享变量的值。为了共享变量是最新的,可以将变量声明为volatile或同步读取和写入操作。将共享变量声明为volatile:final class ControlledStop
8、 implements Runnable private volatile boolean done = false; Override public void run() while (!done) ().sleep(1000); nterrupt(); catch (IOException ie) protected final Object writeObject out) throws NotSerializableException throw new NotSerializableException(); protected final Object readObject in)
9、throws NotSerializableException protected final Object readObjectNoData in) throws NotSerializableException 1.3.2 在序列化过程中避免内存和资源泄漏class SensorData implements Serializable . public static boolean isAvailable() .class SerializeSensorData public static void main(String args) throws IOException ObjectOutputStream out = null; out = new ObjectOutputStream( new BufferedOutputStream(new FileOutputStream(); while () / note that each SensorData object is 1 MB in size SensorData sd = (); (sd); finally if (out != null) (); / reset the stream1.3.3 反序列化要在程序最小权限的安全环境中
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1