注入攻击
通过在条件后面拼接一个 1=1 或者其他一定成立的条件,将所有数据查询出来
先看看效果
JDBC 注入
@Test
public void test1() throws SQLException {
Connection con=JdbcUtil.getConnection();
Statement sm=con.createStatement();
String username="'1' or 1=1";
String psw="'1' or 1=1";
String sql="select*from users where uname="
+username+" and password="+psw;
System.out.println(sql);
ResultSet rs=sm.executeQuery(sql);
if (rs.next()) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
JdbcUtil.close(con, sm, rs);
}
PrepareStatement解决sql注入攻击
public void test() throws SQLException {
Connection con=JdbcUtil.getConnection();
//2.获取执行sql的PreparedStatement
/*
* String username="'1' or 1=1";
* String psw="'1' or 1=1";
*/
String username="admin";
String psw="123";
//?作为参数的值去表示
PreparedStatement ps=con.prepareStatement("select*from users where uname=? and password=?");
//1代表第一个?的值,?的所有从1开始的
ps.setString(1, username);
ps.setString(2, psw);
//执行查询
ResultSet rs=ps.executeQuery();
if (rs.next()) {//判断有没查询出结果
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
JdbcUtil.close(con, ps, rs);
}
PreparedStatement的crud
public void testAdd() throws SQLException {
Connection con=JdbcUtil.getConnection();
//获取预处理preparedStatement
PreparedStatement ps = con.prepareStatement("insert users(uname,password) values(?,?)");
//给?参数设置值
ps.setString(1,"UserName");
ps.setString(2, "123");
int row=ps.executeUpdate();
System.out.println("插入了"+row);
JdbcUtil.close(con, ps,null);
}
/**删除
* @throws SQLException
*/
public void testDel() throws SQLException {
Connection con=JdbcUtil.getConnection();
PreparedStatement ps=con.prepareStatement("delete from users where uid=?");
ps.setInt(1, 6);
int res=ps.executeUpdate();
System.out.println("删除了"+res);
JdbcUtil.close(con, ps, null);
}
public void testUpdate() throws SQLException {
Connection con=JdbcUtil.getConnection();
PreparedStatement ps=con.prepareStatement("update users set uname=? ,password=? where uid=?");
ps.setString(1, "jack");
ps.setString(2, "123");
ps.setInt(3, 1);
int res=ps.executeUpdate();
System.out.println("影响了"+res);
JdbcUtil.close(con, ps, null);
}
@Test
public void testQuery() throws SQLException {
Connection con=JdbcUtil.getConnection();
PreparedStatement ps=con.prepareStatement("select * from users where uname like ?");
// ps.setString(1, "__");
ps.setString(1, "王%");
ResultSet res = ps.executeQuery();
while(res.next()) {
int id=res.getInt("uid");
String uname=res.getString(2);
String psw=res.getString(3);
System.out.println(id+"--"+uname+"--"+psw);
}
JdbcUtil.close(con, ps, res);
}
总结
Jdbc增删改查
步骤:
1.加载驱动
2.获取连接对象 connection
3.执行sql statement —>子接口PreparedStatement
所有的sql里面的参数不要用字符拼接,一律用?代替
Ps.setObject(?的位置,?的值) ?参数位置从1开始
4.如果执行的是查询 resultset
Next() 判断下一行有没有数据
getObject(列号) 根据列号取列的值
Getobject(列名) 根据列名取列的值
5.关闭资源