SQL注入看这篇就够

前言

SQL注入是一种非常出名的安全防范问题。原理很简单,但是问题是在客户端是怎么做到操作/修改后台SQL语句的呢?

快速理解SQL注入原理

我们以登录账号为起始点。

通常,登录账号要求我们输入的是账号(userName)、密码(passWord)

输入完点击确定后后台这里用的java将产生一条sql语句。

假如我们用Java原声的产生sql语句方式,而不是用 PreparedStatement,代码是这样写的:

String sql = "select * from table where user_name='" + userName +"' and pass_word='" + passWord + "'";

将会生成一条语句(这里加入我输入账号:zhanghao 密码:123)

select * from table where user_name ='zhanghao' and 'pass_word=123'

这样看起来一切很ok。

但是如果用户输入的不是zhanghao,而是这样的’ or 1=1 –呢?

这样产生的sql语句就应该是这样的

select * from table where user_name ='' or 1=1 -- 'and pass_word='123'

这样前面的user_name判断条件无效。 并且加入– 注释后面的所有语句!攻击者堂皇的进入系统。

可能此人更心怀不轨,不是要进入系统而是破坏。所以他可能会写:’;DROP DATABASE (DB NAME) —

这样翻译的sql语句就是:

select * from table where user_name='';DROP DATABASE (DB NAME) --  'and pass_word='123'

一条语句被拆解为两条数据库瞬间爆炸。


防止SQl注入手段

很多语言已经帮我们做好了对应的API。比如Java我们用PreparedStatement

   String sql= "select * from users where username=? and password=?;
   PreparedStatement preState = conn.prepareStatement(sql);
   preState.setString(1, userName);
   preState.setString(2, password);
   ResultSet rs = preState.executeQuery();

或者,我们可以用正则,把 有 单引号(‘),分号(;) 和 注释符号(–)的语句给替换掉来防止SQL注入

Java

   return str.replaceAll(".*([';]+|(--)+).*", " ");

原文链接:

https://iamjohnnyzhuang.github.io/database/2016/07/16/SQL%E6%B3%A8%E5%85%A5%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值