要执行什么,而
process.inc 是真正过滤后的数据到达的地方。
注意
确 保
security.inc 总 是 被 包 含 在 每 个 脚 本 的 最 开 始 的 位 置 比 较 好 的 方 法 是 使 用
auto_prepend_file 设置。
过滤的例子
建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例
子,部分例子可以帮助你对此有一个大体的了解。
下面的代码对邮件地址进行了验证:
<?php$clean
=
array();$email_pattern
=
'/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';if
(preg_match($email_pattern, $_POST['email'])){$clean['email'] = $_POST['email'];}?>下面的代
码确保了
$_POST['color']的内容是 red,green,或者 blue:
<?php$clean = array();switch ($_POST['color']){case 'red':case 'green':case 'blue':$clean['color'] =
$_POST['color'];break;}?>下面的代码确保$_POST['num']是一个整数(integer):
<?php$clean = array();if ($_POST['num'] == strval(intval($_POST['num']))){$clean['num'] =
$_POST['num'];}?>下面的代码确保$_POST['num']是一个浮点数(float):
<?php$clean = array();if ($_POST['num'] == strval(floatval($_POST['num']))){$clean['num'] =
$_POST['num'];}?>名字转换
之前每个例子都使用了数组
$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好
的习惯。
永远不要在对数据验证后还将其保存在$_POST 或者$_GET 中,作为开发人员对超
级全局数组中保存的数据总是应当保持充分的怀疑。
需要补充的是,使用
$clean 可以帮助思考还有什么没有被过滤,这更类似一个白名单的作
用。可以提升安全的等级。
如果仅仅将验证过的数据保存在
$clean,在数据验证上仅存的风险是你所引用的数组元素
不存在,而不是未过滤的危险数据。
时机
一旦
PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚
本发送数据。因此,没有数据可以被输入到脚本中(甚至
register_globals 被开启的情况下)。
这就是为什么初始化变量是非常好的习惯。