SQL注入
SQL注入
SELECT * FROM users WHERE 'NAME' = '' OR '1=1' AND 'PASSWORD' = '' OR '1=1';
判断:
使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
PreparedStatement防SQL注入的原理
mysql的底层的setString();方法,其实就是用值代替了?的位置,并且在值的两边加上了单引号,然后再把值当中的所有单引号替换成了斜杠单引号,说白了就是把值当中的所有单引号给转义了!这就达到了防止sql注入的目的,说白了mysql驱动的PreparedStatement实现类的setString()方法内部做了单引号的转义,而Statement不能防止sql注入,就是因为它没有把单引号做转义,而是简单粗暴的直接拼接字符串,所以达不到防止sql注入的目的。
public class TestInsert{
public static void main(String[] args){
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection(); //获取数据库连接
//使用?占位符代替参数
String sql = "INSERT INTO users(id,'NAME','PASSWORD','email','birthday') VALUES(?,?,?,?,?)";
st = conn.prepareStatement(sql); //预编译SQL,先写SQL,然后不执行
//手动给参数赋值
st.setInt(1,3);
st.setString(2,"ban");
st.setString(3,"123456");
st.setString(4,"165545@qq.com");
//注意点:sql.Date 数据库 java.sql.Date()
// util.Date java new Date().getTime() 获得时间戳
st.setDate(5,new java.sql.Date(new Date().getTime()));
//执行
int i = st.executeUpdate();
if (i>0) {
System.out.println("插入成功!");
}
} catch (SQLException e){
e.printStackTrace();
} finally {
JdbcUtils.release(conn,st,rs);
}
}
}

浙公网安备 33010602011771号