本文是共有 5部分
![](/icons/31025de.gif)
系列文章
![](/icons/31025de.gif)
第 2部分
![](/icons/31025dou.gif)
我们将继续介绍 PHP V5.2
![](/icons/31025de.gif)
新增功能
![](/icons/31025dou.gif)
本文主要介绍输入过滤
![](/icons/31025dou2.gif)
接受用户输入或来自不受信任来源
![](/icons/31025de.gif)
任何其他数据是 PHP 开发人员在开发应用
![](/icons/31025chengxu.gif)
时可能承担
![](/icons/31025de.gif)
最常见风险的
![](/icons/31025yi.gif)
![](/icons/31025dou2.gif)
您经常需要引入来自未知来源
![](/icons/31025de.gif)
数据以使应用
![](/icons/31025chengxu.gif)
运行
![](/icons/31025dou.gif)
但是这就给黑客提供了插入任意代码或以其他方式使用应用
![](/icons/31025chengxu.gif)
![](/icons/31025de.gif)
机会
![](/icons/31025dou2.gif)
从 PHP V5.2 开始
![](/icons/31025dou.gif)
输入过滤扩展功能将被默认启用
![](/icons/31025dou.gif)
以使您可以更轻松地针对此类操作采取措施
![](/icons/31025dou2.gif)
输入过滤扩展功能提供了
![](/icons/31025yi.gif)
组
![](/icons/31025hanshu.gif)
来解析和检查输入
![](/icons/31025dou.gif)
然后在
![](/icons/31025hanshu.gif)
中使用此输入
![](/icons/31025dou2.gif)
我们将考察使用这些
![](/icons/31025hanshu.gif)
解析和检查输入而不进行手动编码
![](/icons/31025de.gif)
原因
![](/icons/31025dou.gif)
并介绍
![](/icons/31025yi.gif)
些如何使用这些新
![](/icons/31025hanshu.gif)
![](/icons/31025de.gif)
基本举例
![](/icons/31025dou2.gif)
从任何
![](/icons/31025yi.gif)
个位置输入
输入是大多数应用
![](/icons/31025chengxu.gif)
![](/icons/31025de.gif)
关键
![](/icons/31025dou2.gif)
我们
![](/icons/31025de.gif)
应用
![](/icons/31025chengxu.gif)
将接收大量信息并使用微处理器
![](/icons/31025de.gif)
能力来处理这些信息
![](/icons/31025dou2.gif)
我们可以控制输入进入应用
![](/icons/31025chengxu.gif)
![](/icons/31025de.gif)
位置
![](/icons/31025dou.gif)
但是我们不能控制输入此数据
![](/icons/31025de.gif)
用户
![](/icons/31025de.gif)
意图
![](/icons/31025dou2.gif)
PHP 最初被开发为
![](/icons/31025yi.gif)
种轻松
![](/icons/31025de.gif)
思路方法
![](/icons/31025dou.gif)
用于开发从 HTML 表单收集输入
![](/icons/31025de.gif)
脚本
![](/icons/31025dou2.gif)
它现在
![](/icons/31025de.gif)
功能早已不限于此了
![](/icons/31025dou.gif)
但是我们现在仍然在用它来收集和操作来自许多不受信任
![](/icons/31025de.gif)
源
![](/icons/31025de.gif)
数据
![](/icons/31025dou2.gif)
即使是单独
![](/icons/31025de.gif)
数据输入职员也可能无意识地向应用
![](/icons/31025chengxu.gif)
发送
![](/icons/31025yi.gif)
些问题数据
![](/icons/31025dou.gif)
甚至也必须将其视为不受信任
![](/icons/31025de.gif)
源
![](/icons/31025dou2.gif)
安全是目前十分热门
![](/icons/31025de.gif)
问题
![](/icons/31025dou.gif)
并且随着每次通过
![](/icons/31025de.gif)
硬件和软件Software修订而变得更加热门
![](/icons/31025dou2.gif)
我们总是说得很好听
![](/icons/31025dou.gif)
但是由于情况很复杂
![](/icons/31025dou.gif)
因此我们往往在系统保护
![](/icons/31025de.gif)
关键点 —— 输入上做得差强人意
![](/icons/31025dou2.gif)
思路方法有很多并且实现起来很复杂
![](/icons/31025dou2.gif)
我们完成应用
![](/icons/31025chengxu.gif)
有严格
![](/icons/31025de.gif)
最后期限并且必须履行项目经理(project manager)
![](/icons/31025de.gif)
最后期限
![](/icons/31025dou2.gif)
保护自己免于恶意代码攻击
![](/icons/31025de.gif)
![](/icons/31025yi.gif)
种思路方法是确保接收到预期
![](/icons/31025de.gif)
输入
![](/icons/31025dou2.gif)
在本文中
![](/icons/31025dou.gif)
我们将查看
![](/icons/31025yi.gif)
个阻止用户输入不适当
![](/icons/31025de.gif)
JavaScript
![](/icons/31025de.gif)
举例
![](/icons/31025dou.gif)
并向您展示如何将那些标记从输入中剥离出来
![](/icons/31025dou.gif)
返回实际需要
![](/icons/31025de.gif)
内容
![](/icons/31025dou2.gif)
PHP V5.0 以后
![](/icons/31025de.gif)
版本中提供了输入过滤扩展功能以使您可以更轻松地获得安全性
![](/icons/31025dou2.gif)
PHP V5.2 版本首次默认启用了此功能并实现了开箱即用
![](/icons/31025dou2.gif)
验证和过滤
![](/icons/31025de.gif)
对比
在您
![](/icons/31025de.gif)
编程经历中可能听说过术语:输入验证
![](/icons/31025dou2.gif)
它是应用
![](/icons/31025chengxu.gif)
开发过程中至关重要
![](/icons/31025de.gif)
部分
![](/icons/31025dou.gif)
用于确保传入数据在上下文和内容上都是正确
![](/icons/31025de.gif)
![](/icons/31025dou2.gif)
![](/icons/31025chengxu.gif)
员可以通过正则表达式和测试来查看值是否满足标准(例如
![](/icons/31025dou.gif)
要求输入电子邮件地址并需要确保输入格式正确时)
![](/icons/31025dou2.gif)
如果需要排除 Hotmail 或 Gmail 等免费电子邮件地址
![](/icons/31025dou.gif)
也可以借助此思路方法
![](/icons/31025dou2.gif)
您将使用正则表达式来阻止包含 “hotmail.com” 或 “gmail.com”
![](/icons/31025de.gif)
任何电子邮件地址
![](/icons/31025dou2.gif)
通常认为这类 “处理基本检查以确保输入数据满足某种标准” 就是验证
![](/icons/31025dou2.gif)
在这种情况下
![](/icons/31025dou.gif)
需要确保不必清理数据
![](/icons/31025dou.gif)
或者确实可获得查找
![](/icons/31025de.gif)
数据
![](/icons/31025dou2.gif)
验证
![](/icons/31025de.gif)
目标就是要避免
![](/icons/31025yi.gif)
些简单
![](/icons/31025cuowu.gif)
![](/icons/31025dou.gif)
例如尝试将 NULL 放入不接受这种值
![](/icons/31025de.gif)
字段
![](/icons/31025cuowu.gif)
![](/icons/31025de.gif)
数据或恶意构造
![](/icons/31025de.gif)
数据导致
![](/icons/31025de.gif)
![](/icons/31025cuowu.gif)
可能带来毁灭性
![](/icons/31025de.gif)
后果
![](/icons/31025dou2.gif)
您将需要全力实现
![](/icons/31025yi.gif)
种更全面
![](/icons/31025de.gif)
过滤此信息
![](/icons/31025de.gif)
思路方法
![](/icons/31025dou.gif)
这种思路方法需涵盖针对每种数据类型
![](/icons/31025de.gif)
所有可能测试
![](/icons/31025dou.gif)
而不是执行千篇
![](/icons/31025yi.gif)
律
![](/icons/31025de.gif)
任务或重复
![](/icons/31025de.gif)
任务
![](/icons/31025dou2.gif)
通常
![](/icons/31025dou.gif)
您可能没注意到测试或编写不完整
![](/icons/31025de.gif)
正则表达式
![](/icons/31025dou2.gif)
过滤器扩展功能将帮助提供更完整
![](/icons/31025de.gif)
输入评估
![](/icons/31025dou.gif)
同时减少重复代码编写工作
![](/icons/31025dou2.gif)
在这种情况下
![](/icons/31025dou.gif)
过滤和验证
![](/icons/31025de.gif)
区别的处就在于过滤在安全性上更全面
![](/icons/31025dou2.gif)
过滤器类型以及如何选择
让我们进
![](/icons/31025yi.gif)
步查看扩展功能
![](/icons/31025de.gif)
详细信息
![](/icons/31025dou2.gif)
过滤扩展功能有两种过滤器:Sanitizing 和 Logical
![](/icons/31025dou2.gif)
Sanitizing 过滤器只是允许或禁止
![](/icons/31025zifu.gif)
串中
![](/icons/31025de.gif)
![](/icons/31025zifu.gif)
并将清理后
![](/icons/31025de.gif)
![](/icons/31025zifu.gif)
串作为结果返回
![](/icons/31025dou2.gif)
无论您将哪种数据格式传入这些
![](/icons/31025hanshu.gif)
![](/icons/31025dou.gif)
它们将始终返回
![](/icons/31025zifu.gif)
串
![](/icons/31025dou2.gif)
对于特定类型
![](/icons/31025de.gif)
使用
![](/icons/31025dou.gif)
这是至关重要
![](/icons/31025de.gif)
![](/icons/31025dou.gif)
![](/icons/31025yinwei.gif)
您可以阻止用户发送不适当
![](/icons/31025de.gif)
输入并导致异常结果
![](/icons/31025dou2.gif)
例如
![](/icons/31025dou.gif)
用户可以发现文本块
![](/icons/31025de.gif)
输入被返回到以下页面上并且要利用那些返回信息
![](/icons/31025dou2.gif)
如果清理输入
![](/icons/31025dou.gif)
则将删除输入
![](/icons/31025de.gif)
所有危险部分
![](/icons/31025dou2.gif)
Logical 过滤器将对变量执行测试并根据测试提供 true 或 false 结果
![](/icons/31025dou2.gif)
然后您可以使用结果来决定如何处理数据或获得用户
![](/icons/31025de.gif)
地址
![](/icons/31025dou2.gif)
这种过滤器
![](/icons/31025de.gif)
简单举例是验证年龄
![](/icons/31025dou2.gif)
逻辑测试还可以针对类似 Perl
![](/icons/31025de.gif)
正则表达式进行测试
![](/icons/31025dou2.gif)
让我们看看在进行过滤和验证时使用这些
![](/icons/31025hanshu.gif)
![](/icons/31025de.gif)
![](/icons/31025yi.gif)
些思路方法
![](/icons/31025dou.gif)
了解如何将过滤引入应用
![](/icons/31025chengxu.gif)
![](/icons/31025dou2.gif)
整理行为
让我们开始使用过滤扩展功能
![](/icons/31025de.gif)
清理应用
![](/icons/31025chengxu.gif)
来过滤不需要
![](/icons/31025de.gif)
代码块
![](/icons/31025dou2.gif)
在这个举例应用
![](/icons/31025chengxu.gif)
中
![](/icons/31025dou.gif)
您有
![](/icons/31025yi.gif)
张简单
![](/icons/31025de.gif)
表单
![](/icons/31025dou.gif)
它接收 3个问题和 3个答案
![](/icons/31025dou2.gif)
表单本身没有使用验证或过滤
![](/icons/31025dou2.gif)
查看源代码时
![](/icons/31025dou.gif)
![](/icons/31025yi.gif)
个不幸
![](/icons/31025de.gif)
用户相信这是真
![](/icons/31025de.gif)
![](/icons/31025dou.gif)
并且决定通过编写包括抛出警报
![](/icons/31025de.gif)
JavaScript
![](/icons/31025diaoyong.gif)
![](/icons/31025de.gif)
文本块来测试表单
![](/icons/31025dou2.gif)
如果警报弹出
![](/icons/31025dou.gif)
告诉他输入
![](/icons/31025de.gif)
所有内容都将真正被接受并由应用
![](/icons/31025chengxu.gif)
使用而不进行过滤
![](/icons/31025dou.gif)
这将证明他是正确
![](/icons/31025de.gif)
![](/icons/31025dou2.gif)
清单 1. 简单输入表单
<html>
<body>
<p>What is your name?</p>
<form name="form1" method="get" action="filteringexample1a.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 是接受用户输入
![](/icons/31025de.gif)
常见 HTML 表单
![](/icons/31025dou2.gif)
要求用户提供
![](/icons/31025yi.gif)
些基本信息并且简单地将其返回
![](/icons/31025dou.gif)
而不进行任何其他操作
![](/icons/31025dou2.gif)
在图 1 中
![](/icons/31025dou.gif)
您可以看到用户已经输入了
![](/icons/31025yi.gif)
些信息并准备发送 JavaScript 代码
![](/icons/31025dou.gif)
如果不完成清理工作
![](/icons/31025dou.gif)
这段 JavaScript 代码将发送警报
![](/icons/31025dou2.gif)
图 1. 输入表单
![](http://www.crazycoder.cn/WebFiles/20091/456d09fe-f49d-47f8-ad5a-e5c993ae7d3c.jpg)
Echo "<h1>WRONG!</h1>";
}
![](/icons/31025else.gif)
{
echo "The airspeed of an unladen swallow is " . $airspeed . ".nn";
}
?>
我们已经遵从逻辑测试成功地测试了传入数据
![](/icons/31025dou.gif)
并且向用户显示了正确结果或者
![](/icons/31025yi.gif)
些负面
![](/icons/31025de.gif)
反馈
![](/icons/31025dou2.gif)
不管怎样
![](/icons/31025dou.gif)
我们已经使用了过滤器来确保为输入提供了正确答案
![](/icons/31025dou2.gif)
结束语
“PHP V5.2 中
![](/icons/31025de.gif)
新增功能” 这
![](/icons/31025yi.gif)
系列文章(共 5部分)
![](/icons/31025de.gif)
第 2 部分集中介绍了输入过滤
![](/icons/31025dou2.gif)
我们查看了以下两者
![](/icons/31025de.gif)
差异:简单输入验证以捕获不要求任何清理
![](/icons/31025de.gif)
简单
![](/icons/31025cuowu.gif)
![](/icons/31025dou.gif)
以及旨在捕获潜在
![](/icons/31025de.gif)
更具破坏性
![](/icons/31025de.gif)
输入
![](/icons/31025cuowu.gif)
和问题
![](/icons/31025de.gif)
输入过滤
![](/icons/31025dou2.gif)
然后查看了两种类型
![](/icons/31025de.gif)
过滤扩展功能:Sanitizing 和 Logical
![](/icons/31025dou.gif)
并浏览了两者
![](/icons/31025de.gif)
举例
![](/icons/31025dou2.gif)
在第 3 部分中
![](/icons/31025dou.gif)
我们将查看新
![](/icons/31025de.gif)
JSON 扩展功能
![](/icons/31025dou.gif)
它将为 PHP 开发人员开发 Ajax 应用
![](/icons/31025chengxu.gif)
(使用 JSON
![](/icons/31025de.gif)
)提供更好
![](/icons/31025de.gif)
支持