• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

PHP中 简单的SQL注入分析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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

插入数据如下

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

一、下面开始测试字段为数值类型时的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后都老老实实变成数值类型。

 

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

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

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

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

所有记录都被查出来了。从上图显示的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注入,更深的后面再研究吧


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Centos7 安装Php7 (貌似没成功)发布时间:2022-07-10
下一篇:
菜鸟学PHP之Smarty入门发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap