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);
        }
    }
}
posted @ 2021-08-01 12:08  有我的担忧  阅读(49)  评论(0)    收藏  举报