简单讲解SQL的注入以及防御

简单讲解SQL的注入以及防御:

SQL注入(SQL Injection):

    百度百科:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,

    最终达到欺骗服务器执行恶意的SQL命令。

    我的理解:SQL注入就是用户在输入请求信息时通过拼接(或者注释)SQL语句,达到获取(或者删除)后台信息的目的

SQL注入分为内联SQL注入和终止式SQL注入:

内联 SQL 注入:

1.字符串内联注入:eg:’1’=’1’

SQL语句:

select * from Users where username = '输入的姓名' AND userpwd = '输入的密码'

正常输入:zhangsan和woshimima

 select * from Users where username = 'zhangsan' AND userpwd = 'woshimima'

在用户密码中加入注入代码:’zhangsan’和woshimima OR ‘1’=’1’

 select * from Users where username = 'zhangsan' AND username = 'woshimima' OR '1'='1'

这样用户就可以得到所有的用户信息!

2.数字值内联注入: eg:永真条件1=1

SQL语句:

select * from Users where userage = 输入的年龄 + order by userID DESC

正常输入:19

 select * from Users where userage = 19 + order by userID DESC

在用户年龄中加入注入代码:19 OR 1=1

select * from Users where userage = 19 OR 1=1 + order by userID DESC

这样用户也可以得到所有的用户信息!

终止式 SQL 注入:– 以及 /* */

            select * from Users where username = '输入的姓名' AND userpwd = '输入的密码'

正常输入:zhangsan和woshimima

 select * from Users where username = 'zhangsan' AND userpwd = 'woshimima'

在用户姓名中加入注入代码:zhangsan OR 1=1 ; –

 select * from Users where username = 'zhangsan' AND 1=1 ;-- AND userpwd = ''

这样用户就可以不使用密码进行登录!

SQL注入防御:我们一般使用sql语句预编译和绑定变量来防御SQL注入。

String sql = "select userID from userName where userID= ? ";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            ps.executeQuery();

PreparedStatement就是预编译,它将SQL语句”select userID from userName where userID=?”进行预编译,将此语句预先进行语法分析,无论后边用户输入什么 参数,都不会影响SQL语法结构。也就是说用户的参数只能被当做字符串执行,而不会被当成SQL语句命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值