Never Use $_GET Again-别再使用$_GET页面翻译,Filter扩展

来源:互联网 发布:python局域网嗅探 编辑:程序博客网 时间:2024/05/17 22:48

原文地址:Never Use $_GET Again

别再使用$_GET了

你不需要再使用$_GET或者$_POST。事实上,你或许不应该再使用$_GET和$_POST。PHP5.2以后,有一个新的、更好的方式去安全检索用户提交的数据。

有多少次,我们已经听见关于PHP应用程序的非转义GET和POST参数的安全问题了?通常,对用户输入的适当转义是web开发一直存在的一个问题,而且不论什么理由,PHP似乎在这方面被过度的负面宣传了。
在数据库方面,许多对于SQL注入的担忧已经被解决了。例如:聪明的PDO开发者,建立了一个库,分析数据并适当地转义数据。但是,对于验证和安全化输入仍然是一个实质性的问题。令我惊讶的是,许多有经验的PHP开发者,仍然花费宝贵的开发时间来构建自定义代码来过滤输入。
为什么要惊讶?因为PHP5.2开始,已经有一个内置的过滤系统,简化验证和安全化数据的检索。你可以使用PHP函数,例如:filter_input()和filter_input_array(),而不是直接访问$_GET和$_POST超全局数组。让我们迅速看一个例子:
<?php    $my_string = filter_input(INPUT_GET, 'my_string', FILTER_SANITIZE_STRING);?>

上面的代码大致等同于:检索$_GET['my_string'],之后通过某种过滤器来处理它,去除HTML和其它不希望的字符。这个代表的是数据安全化,是过滤系统可以做的2件事之一。过滤系统的2个任务是:
    validation(验证):确保所提供的数据符合特定的期望,在这种模式下,过滤系统将返回一个boolean类型,表明数据是按规则匹配。
    sanitizing(安全):从输入数据中,移除不想要的数据,并执行任何必要的类型强制转换。在这种模式下,过滤系统返回安全化后的数据。
默认情况下,过滤系统提供许多过滤器,从基本类型的认证和安全化(布尔、整型、符点等)到更高级的过滤器,允许正则表达式或者自定义回调函数。
filter扩展库的作用是显而易见的。我们自己输入检查工具的日子已经一去不复返了。(不需要我们自己写数据过滤规则了)。我们可以使用一个标准的(更好性能的)内置系统。
但是,我想做的更多,而不仅仅是给大家呈现filter系统作为可选的数据过滤的方案。我甚至要说,我们不应该再直接访问包含用户输入的超全局数组。没有任何理由来说明我们应该这么做。过多的,涉及到过滤输入失败的安全问题,为我的声明提供了足够的证明。经常使用过滤系统,并且强制使用它。
“但是”,有人可能反驳,“如果我不需要过滤我的数据呢?”。过滤系统提供了一个null过滤器(FILTER_UNSAFE_RAW)。以防有的数据不需要被过滤(这种情况是极少的),像下面这样使用:
<?php$unfiltered_data = filter_input(FILTER_GET, ‘unfiltered_data’, FILTER_UNSAFE_RAW);?>

我不认为这是愚蠢和疯狂的。使用这种方式,提供了一个优势:通过运行一个简单的查找"FILTER_UNSAFE_RAW"常量操作,我可以迅速发现我代码中所有未过滤的变量。这比通过调用$_GET去查找那些未能正确认证或安全化的变量简单多了。通过这种模式,可以更有效的管理输入的风险控制。
过滤器不会解决每一个相关的安全问题,但是在谈及书写安全的(更高性能的)代码,它们在正确的方向迈了一大步。它也更加简单。当然,函数调用更长了,但是它不需要开发者写他们自己的过滤系统。这些也是不再使用$_GET($_POST或者其他)的好理由。
1 0
原创粉丝点击