JDBC-防止SQL注入

1、什么是sql注入。----->sql拼接安全问题。

由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,对数据安全造成影响

而Statement存在sql注入的问题:因为他的sql字符串拼接。

2、预防方案。 ----->使用PrepareStatement来进行sql得预编译。

PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题

PreparedStatement主要有如下的三个优点:

a. 可以防止sql注入

b. 由于使用了预编译机制,执行的效率要高于Statement                                                                                                   

案例代码如下:

package com.ykq.dao;

import com.ykq.entity.User;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
    public Connection connection;
    public PreparedStatement ps;
    public ResultSet resultSet;
    //查询所有
    public List<User> findAll(){
        List<User> list=new ArrayList<>();
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
            String sql = "select * from tb_user";
            ps = connection.prepareStatement(sql);
            resultSet = ps.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                //为java对象得属性赋值
                user.setUid(resultSet.getInt("uid"));
                user.setUname(resultSet.getString("uname"));
                user.setPassword(resultSet.getString("password"));
                user.setSex(resultSet.getString("sex"));
                list.add(user);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //TODO 关闭资源
        }
        return list;
    }


    //根据id查询 1
    public User findById(Integer id){
        User user=null;//声明对象
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
            String sql = "select * from tb_user where uid=?";
            ps = connection.prepareStatement(sql);
            ps.setObject(1, id);
            resultSet = ps.executeQuery();
            while (resultSet.next()) {
                user = new User();
                //为java对象得属性赋值
                user.setUid(resultSet.getInt("uid"));
                user.setUname(resultSet.getString("uname"));
                user.setPassword(resultSet.getString("password"));
                user.setSex(resultSet.getString("sex"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // TODO 关闭资源
        }
        return user;

    }
    //删除 --- id删除
    public int deleteById(int id){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
            String sql = "delete from tb_user where uid=?";
            ps = connection.prepareStatement(sql);
            ps.setObject(1, id);
            int i = ps.executeUpdate();
            return i;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // TODO 删除
        }
        return 0;
    }

    //修改
    public int update(User user){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
            String sql = "update tb_user set uname=?,sex=?,password=? where uid=?";
            ps = connection.prepareStatement(sql);
            ps.setObject(1, user.getUname());
            ps.setObject(2, user.getSex());
            ps.setObject(3, user.getPassword());
            ps.setObject(4, user.getUid());
            int i = ps.executeUpdate();
            return i;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // TODO 删除
        }
        return 0;
    }
    //增加
    public int insert(User user){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
            String sql = "insert into tb_user(uid,uname,password,sex) values(null,?,?,?)";
            ps = connection.prepareStatement(sql);
            ps.setObject(1, user.getUname());
            ps.setObject(2, user.getPassword());
            ps.setObject(3, user.getSex());
            int i = ps.executeUpdate();
            return i;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // TODO 删除
        }
        return 0;
    }
}

                                 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值