SQL注入就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。
产生原因是由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
攻击者可以利用它读取、修改或者删除数据库内的数据。一般的防火墙是无法拦截sql注入攻击的。
下面的用户登录验证程序就是sql注入的一个例子(以PHP程序举例)。
1.创建用户表user:
+-------+----------------------------------------------------------------------------------------------------------
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL DEFAULT '',
`password` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`userid`),
UNIQUE KEY `id` (`userid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
+-------+-------------------------------------------------------------------
2.给用户表user添加一条记录
insert into user VALUES (1,'angel','mypass');
3.没有处理用户输入
这或者可以这样说#1:永远不要相信用户的输入。用服务器端的PHP验证每个字符串,不要寄希望与JavaScript。最简单的SQL注入攻击会利用如下的代码:
$username = $_POST["name"]; $password = $_POST["password"]; $sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';"; // run query...
只要在username字段输入“admin';--”,这样就会被黑到,相应的SQL语句如下:
SELECT userid FROM usertable WHERE username='admin';
狡猾的黑客可以以admin登录,他们不需要知道密码,因为密码段被注释掉了。