简单讲解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语句命令。