您的位置:首页 > 数据库

一个关于SQL注入的简单例子

2016-09-21 09:19 232 查看
什么是SQL注入?

SQL注入是利用某些数据库的外部接口将用户数据插入到数据库的操作语言中,从而达到入侵数据库乃至操作系统的目的。

数据库有一张user表;表定义如下:

CREATE TABLE `user` (
`id` char(35) NOT NULL,
`mobile_num` char(20) NOT NULL,
`user_name` char(30) DEFAULT NULL,
`password` char(100) NOT NULL,
`has_card` tinyint(1) NOT NULL DEFAULT '0',
`salt` char(15) DEFAULT NULL,
`token` char(65) DEFAULT NULL,
`is_valid` tinyint(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `mobile_num_UNIQUE` (`mobile_num`),
UNIQUE KEY `user_name_UNIQUE` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


表结构如下:



表中有这么1行数据:



进行普通登录操作时候,会讲账号和密码作为参数传进去,比如:

SELECT *
FROM USER
WH
4000
ERE user_name='   '
AND PASSWORD='   ';


普通用户会进行正常的输入,这样会得到正确的结果,如下:

SELECT *
FROM USER
WHERE user_name='username6'
AND PASSWORD='2d1e482bc247a2540cfe1679f93365f8';


但恶意用户会根据MySQL的特性,只要知道用户名,无需知道密码就能查询到数据,比如:

SELECT *
FROM USER
WHERE user_name='username6' OR '1=1' AND PASSWORD='222';


即,用户在username的空格上只要填上:
username6' OR '1=1
;在password的空格上随便填写一串数据即可。(注意’1=1’只是一个varchar)

那如何去防止SQL注入呢?

在JAVA中可以采用预编译的方法,尽量不要采用连接SQL语句的方法。例如:

String sql = "select * from user u where u.username=? and u.password=?";

preparedstatement ps = connection.preparestatement(sql);
ps.setString(1, "username5");
ps.setString(2, "aaa")


或者,自定义函数把前端数据的参数进行过滤,(1)拒绝已知的非法数据;(2)只接受已知的正确输入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: