`
isiqi
  • 浏览: 16499448 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

PHP V5.2 中的新增功能,第 2 部分: 使用新输入过滤扩展

阅读更多

Tracy Peterson (tracy@tracypeterson.com), 自由作家, Consultant

<chsdate w:st="on" year="2007" month="4" day="17" islunardate="False" isrocdate="False"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt">2007 </span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt"> 4 </span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">月</span></chsdate> 17

PHP V5.2 中的新增功能这一系列的第 2 部分中,了解如何有效使用新的 PHP V5.2 提供的新输入过滤扩展功能。这是一项急需的功能,它将允许您验证表单和其他输入介质的输入而无需依赖第三方软件。阅读本文后,您将能有效地过滤输入以提高应用程序的安全性。

本文是共有五部分的系列文章的第二部分,我们将继续介绍 PHP V5.2 的新增功能,本文主要介绍输入过滤。

接受用户输入或来自不受信任来源的任何其他数据是 PHP 开发人员在开发应用程序时可能承担的最常见风险之一。您经常需要引入来自未知来源的数据以使应用程序运行,但是这就给黑客提供了插入任意代码或以其他方式使用应用程序的机会。从 PHP V5.2 开始,输入过滤扩展功能将被默认启用,以使您可以更轻松地针对此类操作采取措施。输入过滤扩展功能提供了一组函数来解析和检查输入,然后在函数中使用此输入。

我们将考察使用这些函数解析和检查输入而不进行手动编码的原因,并介绍一些如何使用这些新函数的基本示例。

从任何一个位置输入

输入是大多数应用程序的关键。我们的应用程序将接收大量信息并使用微处理器的能力来处理这些信息。我们可以控制输入进入应用程序的位置,但是我们不能控制输入此数据的用户的意图。PHP 最初被开发为一种轻松的方法,用于开发从 HTML 表单收集输入的脚本。它现在的功能早已不限于此了,但是我们现在仍然在用它来收集和操作来自许多不受信任的源的数据。即使是单独的数据输入职员也可能无意识地向应用程序发送一些问题数据,甚至也必须将其视为不受信任的源。

安全是目前十分热门的问题,并且随着每次通过的硬件和软件修订而变得更加热门。我们总是说得很好听,但是由于情况很复杂,因此我们往往在系统保护的关键点 —— 输入上做得差强人意。方法有很多并且实现起来很复杂。我们完成应用程序有严格的最后期限并且必须履行项目经理的最后期限。

保护自己免于恶意代码攻击的一种方法是确保接收到预期的输入。在本文中,我们将查看一个阻止用户输入不适当的 JavaScript 的示例,并向您展示如何将那些标记从输入中剥离出来,返回实际需要的内容。

PHP V5.0 以后的版本中提供了输入过滤扩展功能以使您可以更轻松地获得安全性。PHP V5.2 版本首次默认启用了此功能并实现了开箱即用。

验证与过滤的对比

在您的编程经历中可能听说过术语:输入验证。它是应用程序开发过程中至关重要的部分,用于确保传入数据在上下文和内容上都是正确的。程序员可以通过正则表达式和测试来查看值是否满足标准(例如,要求输入电子邮件地址并需要确保输入格式正确时)。如果需要排除 Hotmail Gmail 等免费电子邮件地址,也可以借助此方法。您将使用正则表达式来阻止包含 “hotmail.com” “gmail.com” 的任何电子邮件地址。

通常认为这类处理基本检查以确保输入数据满足某种标准就是验证。在这种情况下,需要确保不必清理数据,或者确实可获得查找的数据。验证的目标就是要避免一些简单错误,例如尝试将 NULL 放入不接受这种值的字段。

错误的数据或恶意构造的数据导致的错误可能带来毁灭性的后果。您将需要全力实现一种更全面的过滤此信息的方法,这种方法需涵盖针对每种数据类型的所有可能测试,而不是执行千篇一律的任务或重复的任务。通常,您可能没注意到测试或编写不完整的正则表达式。过滤器扩展功能将帮助提供更完整的输入评估,同时减少重复代码编写工作。在这种情况下,过滤与验证的不同之处就在于过滤在安全性上更全面。

过滤器类型以及如何选择

让我们进一步查看扩展功能的详细信息。过滤扩展功能有两种过滤器:Sanitizing Logical

Sanitizing 过滤器只是允许或禁止字符串中的字符并将清理后的字符串作为结果返回。无论您将哪种数据格式传入这些函数,它们将始终返回字符串。对于特定类型的使用,这是至关重要的,因为您可以阻止用户发送不适当的输入并导致异常结果。例如,用户可以发现文本块的输入被返回到以下页面上并且要利用那些返回信息。如果清理输入,则将删除输入的所有危险部分。

Logical 过滤器将对变量执行测试并根据测试提供 true false 结果。然后您可以使用结果来决定如何处理数据或获得用户的地址。这种过滤器的简单示例是验证年龄。逻辑测试还可以针对类似 Perl 的正则表达式进行测试。

让我们看看在进行过滤和验证时使用这些函数的一些方法,了解如何将过滤引入应用程序。

整理行为

让我们开始使用过滤扩展功能的清理应用程序来过滤不需要的代码块。

在这个示例应用程序中,您有一张简单的表单,它接收三个问题和三个答案。表单本身没有使用验证或过滤。查看源代码时,一个不幸的用户相信这是真的,并且决定通过编写包括抛出警报的 JavaScript 调用的文本块来测试表单。如果警报弹出,告诉他输入的所有内容都将真正被接受并由应用程序使用而不进行过滤,这将证明他是正确的。


清单 1. 简单输入表单

<html>

<body>

<p>What is your name?</p>

<form name="form1" method="get" action="filteringexample<chmetcnv w:st="on" unitname="a" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1a</chmetcnv>.php">

<p>

<input name="1" type="text" id="1">

</p>

<p>What is your favorite color?</p>

<p>

<input name="2" type="text" id="2">

</p>

<p>What is the airspeed of an unladen swallow?</p>

<p>

<textarea name="3" id="3"></textarea>

</p>

<p>

<input type="submit" name="Submit" value="Submit">

</p>

</form>

</body>

</html>

清单 1 是接受用户输入的常见 HTML 表单。要求用户提供一些基本信息并且简单地将其返回,而不进行任何其他操作。在图 1 中,您可以看到用户已经输入了一些信息并准备发送 JavaScript 代码,如果不完成清理工作,这段 JavaScript 代码将发送警报。


1. 输入表单
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 338.25pt; HEIGHT: 289.5pt" alt="输入表单" type="#_x0000_t75"><imagedata o:href="http://www.ibm.com/developerworks/cn/opensource/os-php-v522/fig01.jpg" src="file:///C:%5CDOCUME~1%5Csgcs1642%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>

接下来,创建一个脚本来捕获表单变量并在另一个页面中将其打印输出。


清单 2. PHP 表单

<body>

<?php

echo "You are " . $_GET['1'] . ".<br>\n";

echo "Your favorite color is " . $_GET['2'] . ".<br>\n";

echo "The airspeed of an unladen swallow is " . $_GET['3'] . ".<br>\n";

?>

</body>

现在您可以看到如果只是返回这个输入而不使用任何类型的过滤将会发生什么情况。


2. 表单的输出
<shape id="_x0000_i1026" style="WIDTH: 338.25pt; HEIGHT: 229.5pt" alt="表单的输出" type="#_x0000_t75"><imagedata o:href="http://www.ibm.com/developerworks/cn/opensource/os-php-v522/fig02.jpg" src="file:///C:%5CDOCUME~1%5Csgcs1642%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.jpg"></imagedata></shape>

如您所见,不幸的用户已经执行了一些随机代码。假定,这段代码只位于客户端(不幸用户自己的 PC 计算在内,并且在这种情况下不表示对应用程序构成威胁),但是它肯定不是有效输入。

清理输入字符串

清单 3 演示了使用 filter_var() FILTER_SANITIZE_STRING 选项进行清理的简单示例。


清单 3. 添加代码到接收 PHP 脚本中

<?php

echo "You are " . filter_var($_GET['1'], FILTER_SANITIZE_STRING) . ".<br>\n";

echo "Your favorite color is " . filter_var($_GET['2'], FILTER_SANITIZE_STRING) .

".<br>\n";

echo "The airspeed of an unladen swallow is " . filter_var($_GET['3'], FILTER_SANITIZE_STRING)

. ".<br>\n";

?>

如您所见,开始使用 filter_var() 函数来清理输入并使其有效并且安全。在这种情况下,使用选项 FILTER_SANITIZE_STRING,该选项将获取输入、删除所有 HTML 标记并选择性地编码或删除特定字符。

由于它将除去 HTML 标记,因此尝试运行 JavaScript 将失败,并且从脚本中获得更适当的结果。



与尝试用正则表达式和字符串函数手动完成此工作相比,使用 filter_var() 函数将极大地减少编码量。在那种情况下,您将必须编写只执行 HTML 代码块的另外若干行代码和显式正则表达式,并且解析整个输入的文本块以确保没有遗漏任何 HTML 标记。而使用提供的函数将更简单。

用户输入 —— 毫无逻辑

一些输入是数字或有指定的式样。在这些情况下,您可以使用逻辑过滤选项并针对表达式或其他逻辑测试检查数据。如果表达式读到 true,则数据将成功通过过滤器。如果逻辑测试证明数据为 false,则数据将不能通过过滤器。首先,我们将设置一个简单的逻辑测试用于检查确保燕子坠落的速度在规定的范围内,因为燕子的空中速度可能不同。设置完测试后,我们将添加一些代码来告诉用户答案是否不正确。正确答案应当只需重复。


清单 4. 添加代码到接收 PHP 脚本中

<?php

echo "You are " . $_GET['1'] . ".<br>\n";

echo "Your favorite color is " . $_GET['2'] . ".\n\n";

$minSpeed = 12;

$maxSpeed = 13;

$airspeed = filter_var($_GET['3'], FILTER_VALIDATE_INT, array("options" =>

array("min_range"=>$minSpeed, "max_range"=>$maxSpeed)));

echo "The airspeed of an unladen swallow is " . $airspeed . ".\n\n";

?>

清单 4 将根据速度的最小值和最大值范围检查坠落的燕子问题的答案。这可以简单地确保它确实是一个 INT 变量,但是也在 $minSpeed $maxSpeed 中添加了一个范围。如果用户答案不在可接受的值的范围内,结果将得到 FALSE。随后可以测试这个答案并且把正确答案返回给用户。在这种情况下,我们将直言不讳。


清单 5. 添加代码到接收 PHP 脚本中

<?php

echo "You are " . $_GET['1'] . ".<br>\n";

echo "Your favorite color is " . $_GET['2'] . ".\n\n";

$minSpeed = 12;

$maxSpeed = 13;

$airspeed = filter_var($_GET['3'], FILTER_VALIDATE_INT, array("options" =>

array("min_range"=>$minSpeed, "max_range"=>$maxSpeed)));

If ($airspeed === FALSE){

Echo "<h1>WRONG!</h1>";

}else{

echo "The airspeed of an unladen swallow is " . $airspeed . ".\n\n";

}

?>

我们已经遵从逻辑测试成功地测试了传入数据,并且向用户显示了正确结果或者一些负面的反馈。不管怎样,我们已经使用了过滤器来确保为输入提供了正确答案。

结束语

PHP V5.2 中的新增功能这一系列文章(共五部分)的第 2 部分集中介绍了输入过滤。我们查看了以下两者的差异:简单输入验证以捕获不要求任何清理的简单错误,以及旨在捕获潜在的更具破坏性的输入错误和问题的输入过滤。然后查看了两种类型的过滤扩展功能:Sanitizing Logical,并浏览了两者的示例。在第 3 部分中,我们将查看新的 JSON 扩展功能,它将为 PHP 开发人员开发 Ajax 应用程序(使用 JSON 的)提供更好的支持。

从 1997 年开始,Tracy Peterson 一直担任 IT 项目经理和 Web 开发人员,最近在 Microsoft 公司 MSN Search 小组担任运营计划经理。他居住在旧金山。

<shape id="_x0000_i1027" style="WIDTH: 337.5pt; HEIGHT: 147.75pt" alt="从修订后的 PHP 脚本获得的清理后的输出" type="#_x0000_t75"><imagedata o:href="http://www.ibm.com/developerworks/cn/opensource/os-php-v522/fig03.jpg" src="file:///C:%5CDOCUME~1%5Csgcs1642%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.jpg"></imagedata></shape>

3. 从修订后的 PHP 脚本获得的清理后的输出
分享到:
评论

相关推荐

    PHP5.2 windows

    5. **过滤器**:新增了数据过滤功能,可以确保输入数据的安全性,防止SQL注入等安全问题。 6. **XML支持增强**:包括DOM、SimpleXML、XMLReader和XMLWriter等扩展,提供了更强大的XML处理能力。 然而,随着时间的...

    phpStudy php 5.2

    5. **过滤变量**:增加了`filter_var()`函数,用于验证和过滤输入数据,提高了应用的安全性。 **phpStudy 2013B中的组件** 在phpStudy2013B这个版本中,可能包含以下组件: 1. **Apache服务器**:作为Web服务器,...

    phpStudy_2013(php5.2)

    5. **过滤器(Filter)**:提供了数据验证和清理的功能,增强了输入数据的安全性。 6. **SPL(Standard PHP Library)**:标准PHP库包含了很多有用的类和接口,如迭代器、数组对象等,扩展了PHP的功能。 ...

    php mongodb 5.2

    在数据查询方面,PHP MongoDB 5.2支持使用MongoDB的查询语言(MQL),可以实现复杂的数据过滤、投影、排序等功能。例如,根据年龄筛选大于25岁的文档: ```php $query = new MongoDB\Driver\Query(['age' =&gt; ['$gt'...

    PHP5.2淘宝版.rar

    PHP5.2是PHP语言的一个重要版本,发布于2006年,是许多开发者心中的经典。...如果你正在使用或打算学习PHP5.2,这个"PHP5.2淘宝版.rar"压缩包将是一个很好的起点,可以帮助你快速搭建开发环境并投入到PHP的世界中去。

    php-5.2-win32.zip

    标题 "php-5.2-win32.zip" 暗示了这是一个针对Windows 32位系统的PHP 5.2版本的压缩包。...同时,需要注意这个版本的PHP可能存在已知的安全漏洞,因此在生产环境中使用时,应考虑升级到更现代且维护良好的PHP版本。

    PHP5.2 New feature one(Filter)

    在 PHP 5.2 版本中,引入了一个重要的新特性——Filter 模块。这个模块主要是为了提供数据验证和过滤的功能,帮助开发者确保处理的数据是安全可靠的。Filter 模块的出现,使得在 PHP 中进行输入验证变得更加方便和...

    PHP5最新中文手册CHM(2013年10月更新)

    ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■用户空间命名指南 ■关于本手册 ■Creative Commons Attribution 3.0 ■索引 ■更新日志 ■CHM 版本 ■...

    PHPvod视频点播系统 2.6 for php5.2.x utf-8.rar

    PHPvod视频点播系统 2.6 for php5.2.x utf-8 改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv_...

    PHP5.2.6源代码

    PHP5.2.6发布于2008年,是PHP5系列的一个稳定版本,它在5.2系列中引入了若干新特性、修复了许多bug,并且提高了整体性能。 1. **新特性和增强**: - 引入了SPL(Standard PHP Library),一个标准的PHP扩展库,...

    WordPress v5.2 RC2

    **WordPress v5.2 RC2 知识点详解** WordPress,作为全球最受欢迎的内容管理系统(CMS),自2003年发布以来,一直以其强大的可扩展性、灵活性和易用性深受用户喜爱。版本v5.2 RC2是WordPress的一个候选发布版本,...

    PHP5.2.0中文使用手册

    10. **安全实践**:手册会讲解如何防止SQL注入、XSS攻击等常见Web安全问题,以及如何使用PHP的过滤和验证函数来确保输入数据的安全。 总的来说,《PHP5.2.0中文使用手册》是学习和掌握PHP5.2.0不可或缺的工具,它将...

    Discuz新秀网络验证系统-UTF8-ver5.2 - 2020.2.13

    扩展模块:新增用户扩展数据存储、备注; 调用模块:帖子调用、会员排行; 日志模块:接口日志: 提现模块:申请提现、后台打款; 用户组模块:购买、充值、切换; 论坛模块:列表、发帖、回帖 排行模块:会员...

    Discuz新秀网络验证系统-GBK-ver5.2 - 2020.2.13

    扩展模块:新增用户扩展数据存储、备注; 调用模块:帖子调用、会员排行; 日志模块:接口日志: 提现模块:申请提现、后台打款; 用户组模块:购买、充值、切换; 论坛模块:列表、发帖、回帖 排行模块:会员...

    PHPMailer_5.2.1

    10. **插件扩展**:通过扩展类,可以添加更多的功能,如垃圾邮件过滤、邮件队列管理等。 在使用PHPMailer_5.2.1时,开发者通常需要以下步骤: 1. **引入库**:通过`require_once 'path/to/PHPMailerAutoload.php';...

    最新PHP中文手册7月1号php_manual_zh.part3.rar

    ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于...

    最新PHP中文手册7月1号php_manual_zh.part1.rar

    ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于...

    最新PHP中文手册7月1号php_manual_zh.part4.rar

    ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于...

    install_5.2_far采集插件_苹果cms_

    苹果CMS是一款广泛使用的开源视频网站管理系统,而"install_5.2_far采集插件_苹果cms_"这个标题指的是为苹果CMS系统安装一个名为"FAR"的版本5.2的采集插件。采集插件在内容管理系统中扮演着重要的角色,它们能够自动...

    php5中文手册20111124

    官方最新PHP中文手册2011-11...可用过滤器列表 所支持的套接字传输器(Socket Transports)列表 PHP 类型比较表 解析器代号列表 Userland Naming Guide 关于本手册 Creative Commons Attribution 3.0 函数索引 CHM 版本

Global site tag (gtag.js) - Google Analytics