天天看点

JDBC sql注入风险及preparedStatement的使用

问题

sql注入: 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

解决办法

       为了解决这个问题,我们使用preparedStatement来执行sql命令,它的使用跟之前的Statement不太一样,它不能使用字符串拼接,未知的参数用“?”(占位符)代替,后面可以进行赋值,并且它在执行executeQuery和executeUpdate方法时不用传递参数。

步骤:

步骤:

        创建集合或者实体类对象(可选-查询)    

        加载驱动

        获取连接对象

        设置手动数据提交(可选--增删改)

        创建sql命令

        获取sql命令对象

        给占位符赋值

        执行sql语句

        遍历执行结果(可选--查询)

        提交数据(可选--增删改)

        回滚数据(可选-增删改)

        关闭资源

        返回结果

public User getUSerInfo(String uname, String upwd) throws ClassNotFoundException, SQLException {
        User u=null;
        Connection conn=JdbcUtil.getConnection();
        String sql="select * from t_user where uname=? and upwd=?";
        PreparedStatement ps= JdbcUtil.getPreparedStatement(conn,sql);
        ps.setString(1,uname);
        ps.setString(2,upwd);
        ResultSet rs=ps.executeQuery();
        while(rs.next()){
            u=new User();
            u.setUnum(rs.getInt("unum"));
            u.setUname(rs.getString("uname"));
            u.setUpwd(rs.getString("upwd"));
            return u;
        }

        JdbcUtil.closeAll(rs,ps,conn);

        return u;
    }

    //新增--preparedStatement
    public int insUser2() throws ClassNotFoundException, SQLException{

        //创建连接对象
        Connection conn=JdbcUtil.getConnection();
        //创建sql命令
        String sql="insert into t_user values(?,?,?)";
        //创建sql命令对象
        PreparedStatement ps=JdbcUtil.getPreparedStatement(conn,sql);
        //给占位符赋值
        ps.setInt(1, 7);
        ps.setString(2,"赵六");
        ps.setString(3,"666");
        //执行sql命令
        int i=ps.executeUpdate();
        //关闭资源
        JdbcUtil.closeAll(null,ps,conn);
        //返回结果
        return i;
    }
    //更新
    public int upUser(String uname,int unum) throws ClassNotFoundException, SQLException {

        //创建连接
        Connection conn=JdbcUtil.getConnection();
        //创建sql命令
        String sql="update t_user set uname=? where unum=?";
        //创建sql命令对象
        PreparedStatement ps=JdbcUtil.getPreparedStatement(conn,sql);
        ps.setString(1,uname);
        ps.setInt(2,unum);
        int i=ps.executeUpdate();
       JdbcUtil.closeAll(null,ps,conn);
        return i;

    }
    //删除
    public  int delUser(int unum) throws ClassNotFoundException, SQLException {

        Connection conn=JdbcUtil.getConnection();
        //创建sql命令
        String sql="delete from t_user where unum=?";
        //创建sql命令对象
        PreparedStatement ps=JdbcUtil.getPreparedStatement(conn,sql);
        ps.setInt(1,unum);
        int i=ps.executeUpdate();
        JdbcUtil.closeAll(null,ps,conn);
        return i;
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        UserDaoImpl2 ud=new UserDaoImpl2();
        User u=ud.getUSerInfo("李四","456");
        System.out.println(u);
    }