SQL 多年前入侵数据库的简易手段 以即现在如何避免

前言:

在我们学习到jsbc的时候我们知道了 服务端想要访问和操作客户端需要通过Statement来操作

Statement

Statement对象 用于执行静态sql语句并返回其结果的对象

在连接建立后,需要对数据库进行访问,执行命名或是sql语句可以通过

  1. Statement [存在sql注入]
  2. PreparedStatement [预处理]
  3. CallableStatement [储存过程]

从上文我们可以看到: Statement对象执行sql语句存在sql注入风险

那么到底什么是SQL注入呢

SQL注入

SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入没法的SQL语句或命令,恶意攻击数据库

要防范SQL注入 ,只要用PreparedStatement(从Statement扩展而来)取代Statement就可以了

示例:

我们有的时候进入数据库会进行一些验证

如我们通过键盘输入设置ID和PWD只有输入正确才能访问数据库

Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的账号:");
String ID = scanner.nextLine();
System.out.print("请输入您的密码:");
String PWD = scanner.nextLine();
String sql="select * from admin where name ='ID' and pwd='PWD'";

而如果我们在键盘输入这两端字符串[ 1’ or ] [ or ‘1’='1] 就会 产生万能密码的效果(中间的空格要有):

请输入您的账号: 1' or      
请输入您的密码: or '1'='1

那到底是为什么呢

我们把这两段字符串带入到sql语句中:

select * from admin where name ='1' or ' and pwd=' or '1'='1';

因为最后会通过判断 ’1‘=’1‘ 而 判定成功 所以使用Statement 就有存在SQL注入这样的风险会给数据库造成很大的风险

我们如何防止这件事情

就用我们上文提过的

使用PreparedStatement代替Statement

PreparedStatement执行的SQL语句中会用?来作为形参占位,再通过PreparedStatement对象 对应的setXXX()方法来赋值

setXXX()方法有两个参数 第一个参数代表 SQL语句中?的索引位置(从1开始) ,第二个是设置SQL语句中该?代表的值

示例:

String sql = "select * from ys where name =? and pwd=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, ID);
preparedStatement.setString(2, PWD);

预处理的好处

  1. 可以不再使用+拼接SQL语句,减少语法错误
  2. 有效的解决了SQL注入问题!
  3. 大大减少编译次数,效率较高
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值