1)
SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语句的含义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。在Mybatis Mapper Xml中,#
变量名称创建参数化查询SQL语句,不会导致SQL注入。而$
变量名称直接使用SQL指令,而$
变量名称直接使用SQL指令,将会存在一定风险,当SQL指令所需的数据来源于不可信赖的数据源时,可能会导致SQL注入。
例如:以下代码片段采用$
变量名称动态地构造并执行了SQL查询。
如果攻击者能够替代username中的任意字符串,它们可以使用下面的关于username的字符串进行SQL注入。validuser' OR '1'='1
当其注入到命令时,命令就会变成:select * from db_user where user_name ='validuser' OR '1'='1'
。即使所输入字符串不是来源于不可信赖的数据源,程序仍然存在着一定风险。
2)
程序间接引用了可能为null的变量,从而引发空指针异常。
例如:下面代码片段中,在使用变量data之前没有判断它是否为null。
...
Data data = null
...
data.setId(id);
...
3)
AccessibleObject类是Field、Method和Constructor对象的基类,能够允许反射对象修改访问权限修饰符,绕过由Java访问修饰符提供的访问控制检查。它让程序员能够更改私有字段或调用私有方法,这在通常情况下是不允许的。
例如:以下代码片段中,将Field将accessible
标记设置为true。
Class clazz = User.class;
Field field = clazz.getField("name");
field.setAccessible(true);
...
4)
在序列化类中,调用一些危险方法,例如反射相关的方法,同时如果应用对用户输入,即不可信数据,没有进行校验就进行反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。
例如引起2015年java反序列漏洞的组件Apache Commons Collections中的org.apache.commons.collections.functors.InvokerTransformer
类。
5)
程序中采用DNS名称进行安全认证,但DNS名称是容易被攻击者进行欺骗的。
例如:下面代码片段中,如果发生DNS欺骗,程序执行将会绕过安全验证。
String ip = request.getRemoteAddr();
InetAddress inetAddress = InetAddress.getByName(ip);
if (inetAddress.getCanonicalHostName().endsWith("demo.com")) {
//Verification passed
}
6)
Java API中提供了java.util.Random
类实现PRNG()
,该PRNG是可移植和可重复的,如果两个java.util.Random
类的实例使用相同的种子,会在所有Java实现中生成相同的数值序列。
例如:下面代码片段中,使用了java.util.Random
类,该类对每一个指定的种子值生成同一个序列。
import java.util.Random;
// ...
public static void main (String args[]) {
// ...
for (int i = 0; i < 10; i++) {
Random random = new Random(123456);
int number = random.nextInt(21);
...
}
}