1 sqlInjection
1.1 whatis sqlInjection
sql注入:由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL 关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。
1.2 howto inject
String sql = select * from user where username =' zhangsan' -- ' and password =' ' ;
例如:
恶意注入方式一:输入username: 随意 password: ' or '1'='1
select * from user where username ='xxxxx' andpassword ='xxx' or '1'='1';
* and 优先级 执行 高于 or
恶意注入方式二、在SQL添加 -- 是mysql的注释 用户名框:输入 zhangsan' 空格--空格 password 随意
select * from user where username ='zhangsan' -- ' andpassword ='' ;
注意:以上的 zhangsan' 空格--空格中的zhangsan是数据库存在的
2 jdbc反sqlInjection
2.1 PreparedStatement
java.sql
接口 PreparedStatement
所有超级接口:
所有已知子接口:
public interface PreparedStatement
extends Statement
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。
注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatementpstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY= ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2,110592)
另请参见:
Connection.prepareStatement(java.lang.String),ResultSet
void | setString(int parameterIndex, String x) |
void | setInt(int parameterIndex, int x) |
executeQuery() | |
int | executeUpdate() |
Connection
prepareStatement(String sql) |
2.2 Example
public User findUser(User user){
Connection conn=null;
PreparedStatement pstate=null;
ResultSet rs=null;
User existUser=null;
try{
conn=JdbcUtils.getConnection();
String sql="select *from users where username=? and password=?";
pstate=conn.prepareStatement(sql);
pstate.setString(1, user.getName());
pstate.setString(2, user.getPassword());
rs=pstate.executeQuery();
while(rs.next()){
existUser=new User();
existUser.setName(rs.getString("username"));
existUser.setPassword(rs.getString("password"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.release(conn,pstate,rs);
}
return existUser;
}
@Test
public voidtestFindUser(){
User user=new User();
user.setName("kkk");
user.setPassword("123");
UserDao ud=new UserDao();
User existUser=ud.findUser(user);
System.out.println(existUser);
}