PHP中 简单的SQL注入分析

SQL注入原理:就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

如下介绍SQL注入方式:

首先建表以下:
1 create database sqltest charset utf8
2 
3 create table test (
4 id int,5 name varchar(10),
6 age tinyint unsigned
7 )engine=myisam charset=utf8

插入数据以下php

咱们分红字段为数值类型和字符串类型两种方式进行测试:sql

1、下面开始测试字段为数值类型时的sql注入,sql语句:
1 $id= $_GET['tid'];
2 $sql = "select * from test where id = $id";

查找id为1的记录,在浏览器中输入并执行以下数据库

能够看到,此时只查询到1条记录,查询结果上面显示的是自动拼接好的sql字符串。继续,将浏览器URL中的tid=1 换成tid=1 or 1=1测试,结果以下浏览器

此时全部的记录都被查出来了,这是针对字段为数值类型时 的sql注入方式,为了不被注入咱们能够将代码:服务器

$id= $_GET['tid'];

改为以下:测试

$id= $_GET['tid'] + 0;

原理:当数据库中字段为数值类型时,无论你的参数多么险恶,+0后都老老实实变成数值类型。spa

 

 2、测试字段为数值类型时的sql注入,sql语句:.net

$name = $_GET['name'];
$sql1 = "select * from test where name = '$name'";

查找name为test1的记录,在浏览器中输入并执行以下:code

只查到一条记录,这是正确的。如今把URL中 name=test1 换成 name=test1' or 1=1--'   测试以下:blog

全部记录都被查出来了。从上图显示的sql语句能够看出where后面的表达式 name = 'test1' or 1=1--' 恒为真(--将其后面的字符串都省略掉)

针对上面的sql注入 咱们能够经过将浏览器中接受来的字符转义的方式避免,在php中 能够采用魔术引号的方法,将PHP.ini文件中的参数magic_quotes_gpc置为ON

例如: 浏览器中name = test1‘ or 1=1--',通过转义后获得的sql字符串变为:

select * from test where name = 'test1\' or 1=1--\''

再次查询变为:

这时查不到任何结果,字符串的引号是成对出现的,通过转义后 sql 把test\' or 1=1--\'做为一个字符串,而不是像上述把 'test' 做为一个字符串。

这只是最简单的sql注入,更深的后面再研究吧

相关文章
相关标签/搜索