网站建设
  简约型网页设计套餐998
  实惠型网站建设套餐2580
  综合型网站制作套餐4980
  网站改版与网站维护
  行业网站建设方案
  大型网站建设解决方案
  企业网站建设流程
  帝网科技网站设计与网站制作
建站FAQ
·网站空间问题解答
·企业邮箱问题解答
 
酷站欣赏
·房产酷站(379)
·综合门户(8 9)
·建筑装饰(603)
·手机通讯(354)
·生活购物(376)
·医疗保健(199)
·文化摄影(602)
·休闲体育(399)
>>更多酷站欣赏
网站优化
·Google(谷歌)优化   ·百度(BaiDu)优化
·雅虎(Yahoo)优化    ·Alexa排名优化   
·Google AdSense   ·DMOZ目录提交  
建站知识
·网站建设知识·网站名词解释·网站运营知识
·网络营销知识·搜索引擎知识·实用技术文摘
网站推广
百度网站推广 google网站推广
搜狐网站推广 网易网站推广
新浪网站推广   雅虎网站推广
  您当前位置: 当前位置:帝网科技 >> web开发 >> PHP专栏 >> 浏览文章
 
 
在PHP中全面阻止SQL注入式攻击之一
作者:袁袁整理 来源:帝网科技 日期:2008年09月13日 点击数:


在本系列文章中,我们将全面探讨如何在PHP开发环境中全面阻止SQL注入式攻击,并给出一个具体的开发示例。

一、引言

PHP是一种力量强大但相当容易学习的服务器端脚本语言,即使是经验不多的程序员也能够使用它来创建复杂的动态的web站点。然而,它在实现因特网服务的秘密和安全方面却常常存在许多困难。在本系列文章中,我们将向读者介绍进行web开发所必需的安全背景以及PHP特定的知识和代码-你可以借以保护你自己的web应用程序的安全性和一致性。首先,我们简单地回顾一下服务器安全问题-展示你如何存取一个共享宿主环境下的私人信息,使开发者脱离开生产服务器,维持最新的软件,提供加密的频道,并且控制对你的系统的存取。

然后,我们讨论PHP脚本实现中的普遍存在的脆弱性。我们将解释如何保护你的脚本免于SQL注入,防止跨站点脚本化和远程执行,并且阻止对临时文件及会话的"劫持"。

在最后一篇中,我们将实现一个安全的Web应用程序。你将学习如何验证用户身份,授权并跟踪应用程序使用,避免数据损失,安全地执行高风险性的系统命令,并能够安全地使用web服务。无论你是否有足够的PHP安全开发经验,本系列文章都会提供丰富的信息来帮助你构建更为安全的在线应用程序。

二、什么是SQL注入

如果你打算永远不使用某些数据的话,那么把它们存储于一个数据库是毫无意义的;因为数据库的设计目的是为了方便地存取和操作数据库中的数据。但是,如果只是简单地这样做则有可能会导致潜在的灾难。这种情况并不主要是因为你自己可能偶然删除数据库中的一切;而是因为,当你试图完成某项"无辜"的任务时,你有可能被某些人所"劫持"-使用他自己的破坏性数据来取代你自己的数据。我们称这种取代为"注入"。

其实,每当你要求用户输入构造一个数据库查询,你是在允许该用户参与构建一个存取数据库服务器的命令。一位友好的用户可能对实现这样的操作感觉很满意;然而,一位恶意的用户将会试图发现一种方法来扭曲该命令,从而导致该被的扭曲命令删除数据,甚至做出更为危险的事情。作为一个程序员,你的任务是寻找一种方法来避免这样的恶意攻击。

三、SQL注入工作原理

构造一个数据库查询是一个非常直接的过程。典型地,它会遵循如下思路来实现。仅为说明问题,我们将假定你有一个葡萄酒数据库表格"wines",其中有一个字段为"variety"(即葡萄酒类型):

1.提供一个表单-允许用户提交某些要搜索的内容。让我们假定用户选择搜索类型为"lagrein"的葡萄酒。

2.检索该用户的搜索术语,并且保存它-通过把它赋给一个如下所示的变量来实现:


$variety=$_POST['variety'];


因此,变量$variety的值现在为:


lagrein

3.然后,使用该变量在WHERE子句中构造一个数据库查询:


$query="SELECT*FROMwinesWHEREvariety='$variety'";


所以,变量$query的值现在如下所示:


SELECT*FROMwinesWHEREvariety='lagrein'


4.把该查询提交给MySQL服务器。

5.MySQL返回wines表格中的所有记录-其中,字段variety的值为"lagrein"。
到目前为止,这应该是一个你所熟悉的而且是非常轻松的过程。遗憾的是,有时我们所熟悉并感到舒适的过程却容易导致我们产生自满情绪。现在,让我们再重新分析一下刚才构建的查询。

1.你创建的这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始:


$query="SELECT*FROMwinesWHEREvariety='";

2.使用原有的固定不变的部分与包含用户提交的变量的值:


$query.=$variety;


3.然后,你使用另一个单引号来连接此结果-描述该变量值的结束:
于是,$query的值如下所示:


SELECT*FROMwinesWHEREvariety='lagrein'

这个构造的成功依赖用户的输入。在本文示例中,你正在使用单个单词(也可能是一组单词)来指明一种葡萄酒类型。因此,该查询的构建是无任何问题的,并且结果也会是你所期望的-一个葡萄酒类型为"lagrein"的葡萄酒列表。现在,让我们想象,既然你的用户不是输入一个简单的类型为"lagrein"的葡萄酒类型,而是输入了下列内容(注意包括其中的两个标点符号):


lagrein'or1=1;


现在,你继续使用前面固定的部分来构造你的查询(在此,我们仅显示$query变量的结果值):


SELECT*FROMwinesWHEREvariety='


然后,你使用包含用户输入内容的变量的值与之进行连接(在此,以粗体显示):


SELECT*FROMwinesWHEREvariety='lagrein'or1=1;


最后,添加上下面的下引号:


SELECT*FROMwinesWHEREvariety='lagrein'or1=1;'


于是,这个查询结果与你的期望会相当不同。事实上,现在你的查询包含的不是一条而是两条指令,因为用户输入的最后的分号已经结束了第一条指令(进行记录选择)从而开始了一条新的指令。在本例中,第二条指令,除了一个简单的单引号之外别无意义;但是,第一条指令也不是你所想实现的。当用户把一个单引号放到他的输入内容的中间时,他结束了期望的变量的值,并且引入了另一个条件。因此,不再是检索那些variety为"lagrein"的记录,而是在检索那些满足两个标准中任何一个(第一个是你的,而第二个是他的-variety为"lagrein"或1等于1)的记录。既然1总是1,因此,你会检索到所有的记录!

  相关文章
 
·如何在PHP开启gzip页面压缩实例正文分
·如何正确运用PHP json_encode函数进行
·PHP下载断点续传的代码正文分析错误
·PHP取得客户端IP地址代码正文分析错误
·PHP判断用户IP来路的一个方法正文分析
·PHP+mysql分页代码正文分析错误
·php去除HTML标记正文分析错误
·php轻松快速缓存全站正文分析错误
·php多语言网站解决方案正文分析错误
·php图片验证码函数正文分析错误
·PHP初学者常见问题集(21问答)正文分
·分享PHP技术开发技巧正文分析错误
·cURL库功能简介:抓取网页 POST数据及
·PHP常用函数:过滤HTML字符串正文分析
·php fscanf()函数使用方法详解正文分析
·和php有关的几种常见安全详解正文分析
·php连接mysql出现乱码解决办法正文分析
·PHP非常简单的使用模板制作静态页面正
·非常简单PHP缩略图生成程序源代码正文
·无法载入 mcrypt 扩展,请检查 PHP 配置
 
 

公司环境 | 合作伙伴 | 人才招聘 | 付款方式 | 关于我们

地址:广州市天河区中山大道中120号D805 电话:020-82529556 传真:020-82529556
广州帝网网络科技有限公司 版权所有 粤ICP备08119341号