【asp精品源码栏目提醒】:网学会员为需要asp精品源码的朋友们搜集整理了PHP中防止SQL注入 - 其它资料相关资料,希望对各位网友有所帮助!
在本系列文章中,我们将全面探讨如何在 PHP 开发环境中全面阻止 SQL 注入式攻击,并给出一个具体的开发示例。
一、 引言 PHP 是一种力量强大但相当容易学习的服务器端脚本语言,即使是经验不多的程序员也能够使用它来创建复杂的动态的 web 站点。
然而,它在实现因特网服务的秘密和安全方面却常常存在许多困难。
在本系列文章中,我们将向读者介绍进行 web 开发所必需的安全背景以及 PHP 特定的知识和代码-你可以借以保护你自己的 web 应用程序的安全性和一致性。
首先,我羌虻サ鼗毓艘幌路 衿靼踩 侍展示你如何存取一个共享宿主环境下的私人信息,使开发者脱离开生产服务器,维持最新的软件,提供加密的频道,并且控制对你的系统的存取。
然后,我们讨论 PHP 脚本实现中的普遍存在的脆弱性。
我们将解释如何保护你的脚本免于 SQL 注入,防止跨站点脚本化和远程执行,并且阻止对临时文件及会话的quot劫持quot。
在最后一篇中,我们将实现一个安全的 Web 应用程序。
你将学习如何验证用户身份,授权并跟踪应用程序使用,避免数据损失,安全地执行高风险性的系统命令,并能够安全地使用 web 服务。
无论你是否有足够的 PHP 安全开发经验,本系列文章都会提供丰富的信息来帮助你构建更为安全的在线应用程序。
二、 什么是 SQL 注入 如果你打算永远不使用某些数据的话,那么把它们存储于一个数据库是毫无意义的; 因为数据库的设计目的是为了方便地存取和操作数据库中的数据。
但是,如果只是简单地这样做则有可能会导致潜在的灾难。
这种情况并不主要是因为你自己可能偶然删除数据库中的一切;而是因为,当你试图完成某项quot无辜quot的任务时,你有可能被某些人所quot劫持quot-使用他自己的破坏性数据来取代你自己的数据。
我们称这种取代为quot注入quot。
其实,每当你要求用户输入构造一个数据库查询,你是在允许该用户参与构建一个存取数据库服务器的命令。
一位友好的用户可能对实现这样的操作感觉很满意;然而,一位恶意的用户将会试图发现一种方法来扭曲该命令,从而导致该被的扭曲命令删除数据,甚至做出更为危险的事情。
作为一个程序员,你的任务是寻找一种方法来避免这样的恶意攻击。
三、 SQL 注入工作原理 构造一个数据库查询是一个非常直接的过程。
典型地,它会遵循如下思路来实现。
仅为说明问题,我们将假定你有一个葡萄酒数据库表格quotwinesquot,其中有一个字段为quotvarietyquot(即葡萄酒类型): 1. 提供一个表单-允许用户提交某些要搜索的内容。
让我们假定用户选择搜索类型为quotlagreinquot的葡萄酒。
2. 检索该用户的搜索术语,并且保存它-通过把它赋给一个如下所示的变量来实现: variety _POSTvariety 因此,变量variety 的值现在为: lagrein 3. 然后,使用该变量在 WHERE 子句中构造一个数据库查询: query quotSELECT FROM wines WHERE varietyvarietyquot 所以,变量query 的值现在如下所示: SELECT FROM wines WHERE varietylagrein 4. 把该查询提交给 MySQL 服务器。
5. MySQL 返回 wines 表格中的所有记录-其中,字段 variety 的值为quotlagreinquot。
到目前为止,这应该是一个你所熟悉的而且是非常轻松的过程。
遗憾的是,有时我们所熟悉并感到舒适的过程却容易导致我们产生自满情绪。
现在,让我们再重新分析一下刚才构建的查询。
1. 你创建的这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始: query quot SELECT FROM wines WHERE variety quot 2. 使用原有的固定不变的部分与包含用户提交的变量的值: query . variety 3. 缓螅 闶褂昧硪桓龅ヒ 爬戳 哟私峁描述该变量值的结束: query . quotquot 于是,query 的值如下所示: SELECT FROM wines WHERE variety lagrein 这个构造的成功依赖用户的输入。
在本文示例中,你正在使用单个单词也可能是一组单词来指明一种葡萄酒类型。
因此,该查询的构建是无任何问题的,并且结果也会是