首页 > 编程源码 > 【路人系列】浅谈PHP防注入(程序猿必看)

【路人系列】浅谈PHP防注入(程序猿必看)

楼主:少羽✨ [3级] · 发表于2019-9-10 · 1516次浏览 · 编程源码 ID:

抱歉最近太忙了没有更新自己都没时间练习渗透

某年某月某日某时某分某秒,某人在阅读某PHP程序代码时,发现某处将输入“直接”带入查询语句,当他兴冲冲地抄起阿D时,却没有注入点(magic_quotes_gpc为off)。当他仔细查看代码时,也没发现过滤语句,这是怎么回事呢?实际上,这个程序用了预备查询技术。预备查询技术为何方神圣,且听危险漫步给各位慢慢道来。



预备查询技术实际上是将不完整的SQL语句(如:select * from xxx where id=?“?”是占位符)预先编译好,驻留于内存中,使用时不断将数据代入占位符并执行的一种技术。使用这种技术本意是想快速运行多个格式相同的SQL语句,但由于语句已经编译好,所以代人数据时就不存在数据与语句相混淆的情况,自然也就可以起到防注入的作用。预备查询技术是新版MySQLi库的亮点之一,在介绍预备查询技术之前,先简单说说MySQLi。


- 版权声明 - 1、本帖所有言论和图片等纯属网友个人意见,与流星社区立场无关;
2、其他单位或个人使用、转载或引用本帖时必须同时征得该帖子作者少羽✨流星社区的同意;
3、备注原文地址:https://bbs.liuxingw.com/t/13716.html,可忽略第2条;
4、帖子作者需承担一切因本文发表而直接或间接导致的相关责任;
5、如本帖内容或部分内容转载自其它媒体,这并不代表本站赞同其观点和对其真实性负责;
6、如本帖若为资源类,将仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您安装或使用的设备中彻底删除上述内容;
7、如果您喜欢该程序,请支持正版软件,购买注册,可以得到更好的正版服务;
8、如本帖侵犯到任何版权或违法问题,请立即邮件告知我们,我们将及时予以处理。
29条回复 |  最后回复于2019-9-10

少羽✨ [3级]   回复于2019-9-10

已经习惯了,技术文章没人看

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

一、运行环境



1、MySQLi库可以链接4.1(含)以上版本的Mysql服务器。



2、MySQLi库为PHP5.0(含)以上版本自带。

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

二、安装方式



1、windows编辑php.ini,找到:;extension=php_mysqli,dⅡ这一行,去掉分号,保存,重启apache。



2、(类)unix如:(包括但不限于)mac os x,linux, unix等



重新编译php,加上–with-mysqli=/usr/local/mysql/bin/mysql_config

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

三、改进



1.mysqli可以让程序员以面向对象的方式编写代码,为了做到这一点,可怜的php开发者几乎重写所有代码,在此向他们致敬。



2.mysqli库去掉了一些无用的函数,如:不支持持久连接等。

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

可以看出,mysqli作出了重大的改进,方便了程序员,下面开始介绍预备查询技术。预备查询技术需要七个环节,涉及六个函数,我们一一为大家讲解。



首先先链接MySQL服务器,然后进行预备查询。



1、预备



函数原型:mysqli_stmt mysqli::prepare(string $query)



注意:$query中要含有占位符,占位符可以占数字,文本等类型的数据,但是不能占表名,列名,数据库名等。其中,当占位符占文本时,不要用引号(例如:应该为where username=?,而不是where username_’?’)。根据刚才的介绍,此时就已经编译语句了,自然这里也会有语法检查。

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

2、绑定变量 函数原型:bool mysqli_stmt::bind_param(string $types, mixed &$varl[, mixed&$…])注意:参数一为文本型,其中定义了各个占位符的类型,i是整型,d是浮点型,s是字符串型,b是blob(例如,预备查询语句中有四个占位符,类型分别是字符串型、字符串型、字符串型、整型,则该参数为:”sssi”)。剩下的参数按顺序依次对应预备查询语句中的占位符,变量不需要提前定义。 3、赋值 为第二步中的变量赋值 4、执行 函数原型:bool mysqli_stmt::execute(void) 5、绑定结果 函数原型:bool mysqli_stmt::bind_result (mixed &$varl[,mied&$…]) 注意:参数要一一与返回的字段对应,对于无返回数据的查询,如delete,insert等,无需此步和下一步。

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

6、处理数据 函数原型:bool mysqli_stmt::fetch(void) 注意:此函数无需参数,其功能是将指针处的数据赋给上一步中绑定的变量,并将指针下移 一行,如果指针处没有数据可供返回,函数返回false。由于数据可能有很多条,就得需要用循环处理。 7、关闭查询 函数原型:bool mysqli_stmt::close(void) 还需要关注的一点是,如果想执行多条语句,可以重复3-6步,即重新赋值,再execute一遍。 最后断开链接: 函数原型:bool mysqli::close(void) 以上就是预备查询的基本理论,理论还得靠实践来检验,下面对两份程序进行测试,首先介绍测试环境: B:Safari 5.0(6533.16)on MAC OS X10.6.4 S:Apache/2.2.15 PHP/5.3.2 mysql-5.5-m2-osx10.6-x86_64 MAC OS X10.6.4

回复列表

  • 内容加载中...

请输入回复内容

少羽✨ [3级]   回复于2019-9-10

其次,安装测试程序。这个程序是我自己写的,意在说明意思,做得比较简陋,凑合看下。安装方法见光盘。下面进行测试,先测试第一套新闻系统。从源代码看出,程序将变量直接带入SQL语句,造成注入,提交返回空白页面。



提交:http://localhost/newsl/news.php?id=1 and 1=2 union select 1,user,pass fromadmin,返回后台地址。



用得到的用户名与密码登录后台(http://localhost/news1/admin)成功。



然后测试第二套系统。从源代码看出,程序使用了预备查询技术,而且没有过滤,提交注入语句的非数字部分均被忽略(是因为绑定变量是类型定义为数字的缘故)所以无法注入。通过测试可以看出,预备查询可以防范注入攻击。这样的技术应当引起程序员的重视!

回复列表

  • 内容加载中...

请输入回复内容

北港 [2级]   回复于2019-9-10

可以

回复列表

  • 内容加载中...

请输入回复内容

华霜 [1级]   回复于2019-9-10

回复列表

  • 内容加载中...

请输入回复内容
登录后才可进行评论
签到
68人签到
已签0天
  • 40655帖子
  • 1859525热点量
  • 528100火热值