StringsqlStr="SELECT * FROM t_user_info WHERE name = '"+userName
+"' AND password = '"+password+"'";
stmt=connection.createStatement();
rs=stmt.executeQuery(sqlString);
...// 结果集处理
}catch(SQLExceptionex){
// 处理异常
}
```
上述示例中使用用户提交的用户名和密码构造SQL语句,验证用户名和密码信息是否匹配,通过字符串拼接的方式构造SQL语句,存在SQL注入。恶意用户在仅知道用户名时,通过`zhangsan' OR 'a' = 'a`和**任意密码**的方式就能完成上述代码中的查询。
**【正例】**(使用PreparedStatement进行参数化查询)
```java
PreparedStatementstmt=null;
ResultSetrs=null;
try{
StringuserName=request.getParameter("name");
Stringpassword=request.getParameter("password");
...// 确保userName和password的长度是合法的
StringsqlStr="SELECT * FROM t_user_info WHERE name=? AND password =?";
stmt=connection.prepareStatement(sqlStr);
stmt.setString(1,userName);
stmt.setString(2,password);
rs=stmt.executeQuery();
...// 结果集处理
}catch(SQLExceptionex){
// 处理异常
}
```
参数化查询在SQL语句中使用占位符表示需在运行时确定的参数值,使得SQL查询的语义逻辑预先被定义,实际的查询参数值则在程序运行时再确定。参数化查询使得数据库能够区分SQL语句中语义逻辑和数据参数,以确保用户输入无法改变预期的SQL查询语义逻辑。如果攻击者输入userName为`zhangsan' OR 'a' = 'a`,该字符串仅会作为name字段的值来使用。
XML实体包括内部实体和外部实体。外部实体格式:`<!ENTITY 实体名 SYSTEM "URI"\>`或者`<!ENTITY 实体名 PUBLIC "public_ID" "URI"\>`。Java中引入外部实体的协议包括http、https、ftp、file、jar、netdoc、mailto等。XXE漏洞发生在应用程序解析来自外部的XML数据或文件时没有禁止外部实体的加载,造成任意文件读取、内网端口扫描、内网网站攻击、DoS攻击等危害。