php中使用过滤功能的输入验证

发布时间:2020-09-18编辑:脚本学堂
在PHP的过滤功能可能不性感,但如果你学会了如何正确地使用它们,它们可以改善的稳定性,安全性,甚至你的代码的可维护性。

    在PHP的过滤功能可能不性感,但如果你学会了如何正确地使用它们,它们可以改善的稳定性,安全性,甚至你的代码的可维护性。
在以下的内容中将解释为什么输入验证是非常重要的,重要的是为什么使用内置函数执行输入验证PHPS,然后扔在一起的一些例子(即使用filter_input()和filter_var() ),讨论了一些潜在的隐患。
 
为什么要输入验证是非常重要
输入验证是其中一个最重要的事情可以做,以确保代码的安全性,因为输入的是经常的一件事对您的应用程序,你不能直接控制。因为你无法控制它,你可以不相信它。
不幸的是,作为程序员,我们往往只想到如何,我们希望他们的工作写的东西。我们不考虑别人可能会想如何使他们的工作 - 无论是出于好奇,无知或恶意。
我现在不打算进入太多有关你可以获取到,如果你不没有验证用户输入的麻烦的细节;有是1称为这个非常网站真的很好的文章PHP的安全性:跨站点脚本攻击是否要读了上它。但我会说,验证您输入的是确保你所编写的代码将被执行,如预期的第一步。
也许你到PHP,从另一种语言,你可能会想,“这是从来没有一个问题之前,我为什么要关心?”验证的原因是一个问题,是因为PHP是松散类型。这使得PHP的一些事情,但它可以使像数据验证的事情有点麻烦,因为你几乎可以通过任何东西。
 
为什么使用内置方法是很重要
为了尝试,使验证更容易一点点从PHP 5.2.0起,我们现在可以使用filter_input()和filter_var()函数。谈论他们,我会尽快在更多的细节,但首先我想谈谈我们为什么要使用PHP提供的,而不是依靠我们自己的方法或第三方工具的功能。

你滚你自己的验证方法时,你通常落入同样的陷阱,你可以设计其他功能时落入边缘的情况下,你要想想你想想,不一定所有的,可以用来掩盖不同载体某些输入。另一个问题是,如果你是像我这样的事,任何代码审查处理手卷验证码第10分钟花在tutting因为程序员没有这样做你会做什么。这可能导致程序员花费更多的时间学习的codebase和阅读,可代替用于编码的内部文件。

有些人不推出自己的,而是选择一个第三方的解决方案。也有一些好的,在那里,在过去,我已经使用OWASP的ESAPI一些额外的验证。这些比也许手卷的解决方案更好,因为更多的眼睛都在看着他们,但你必须引入第三方的代码到您的项目的问题。再次,这增加了时间花在学习代码库和阅读其他文档,而不是编码。
由于这些原因,使用本机的功能是更好的;此外,由于这些功能是烤成的语言,这意味着我们有一个地方去所有的php文件。新的开发将有一个更大的机会,知道代码是什么,以及如何最好地使用它。作为这一结果的支持,它会更容易。
希望现在的我,你相信,验证是非常重要的,这将是一个好主意,使用PHP函数来帮助你实现你的验证需求。如果你不相信,发表评论,让我们来讨论它。
 
一些例子
filter_input()函数在PHP 5.2.0中引入,并允许你得到外部变量的名字和过滤。时处理的$ _GET和$ ??_POST数据,这是非常有用的。
让我们看看一个简单的页面,上面写着从URL传递一个值,并处理它作为一个例子。我们知道,这个值应该是15和20之间的整数。
会是这样做的方法之一:
 

复制代码 代码如下:
<?php
 if (isset($_GET["value"])) {
     $value = $_GET["value"];
 }
 else {
     $value = false;
 }
 if (is_numeric($value) && ($value >= 15 && $value <= 20)) {
     // run my code
 }
 else {
     // handle the issue
 }

这是一个非常基本的例子,我们已经写更多的行,我想看到??的。
首先,因为我们不能确定设置的$ _GET,代码执行适当的检查,使脚本不翻倒。
其次是美元值现在是一个“脏”的变量,因为它已被直接从指定的$ _GET价值的事实。我们需要照顾,不使用美元的价值在代码的其他地方的情况下,我们打破任何东西。
再有就是,16.0 is_numeric()函数是有效的,因为各种语气词它的问题。
最后,我们必须与事实问题,如果声明是了一口采取位,是一个额外的逻辑位通过当你通过代码跟踪工作。
现在比较上面的例子:
 

复制代码 代码如下:
<?php
$value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT,
    array("options" => array("min_range" => 15, "max_range" => 20)));
if ($value) {
     // run my code
}
else {
    // handle the issue
}

不会让你感觉温暖和模糊?
filter_input()处理的$ _GET值没有被设置,所以你不必强调脚本是否接收正确的信息,或不。
你也不必约担心美元价值是肮脏的,因为它已被证实之前,它已经被分配。
注意现在的16.0不再有效。
最后,我们的逻辑不再复杂。这只是一个快速检查为truthy值(filter_input()如果验证失败,将返回false和null如果没有设置$ _GET [“价值”)。
显然,在一个真实的世界设定,你可以提取数组存储在配置文件中的变量到某个地方,以便可以得到的东西,甚至无需进入业务逻辑改变。华丽!
现在,你可能会想,这可能是有用抢一对夫妇的简单脚本的$ _GET或$ _POST变量,但内部使用的函数或类约?幸运的是,我们有该filter_var() 。
filter_var()函数被引入,同时作为filter_input()做同样的事情。
 

复制代码 代码如下:

 <?php
//这是一个示例函数,不使用这实际上电子邮件,

//那将是愚蠢的。
 function emailUser($email) {
     mail($email, "Here is my email", "Some Content");
 }

这里的危险是,有没有试图发送一封电子邮件,从字面上任何值可以存储在停止邮件()函数$电子邮件。这可能会导致无法发送电子邮件,或东西越来越可能在最坏的情况下使用的恶意功能。
我所看到的人做的 ??结果支票的mail() ,这是很好看,如果该函数成功完成,但损害的是时间值返回。
像这样的东西是更加理智:
 

复制代码 代码如下:
 <?php
 // This is a sample function, do not use this to actually email,
 // that would be silly.
 function emailUser($email) {
     $email = filter_var($email, FILTER_VALIDATE_EMAIL);
     if ($email !== false) {
         mail($email, "Here is my email", "Some Content");
     }
     else {
         // handle the issue invalid email address
     }
 }

用了很多例子,包括上述的问题是,他们是基本的。你可能会想,不能用于基本检查以外的任何filter_var()或filter_input() 。并允许你在一个过滤器传递给这些函数称为FILTER_CALLBACK。
FILTER_CALLBACK使您可以通过在您创建将接受被过滤的变量输入功能-这是哪里,你就可以开始,因为有很多的乐趣,你就可以开始自己的业务逻辑应用到您的过滤。
一些潜在的缺陷
这些功能是非常伟大,他们让你做一些真正强大的过滤,我们已经讨论过,可以帮助提高你的代码的安全性和可靠性。但是也有一些潜在的缺点,我会觉得我是失职的,如果我不指出来。
主要缺陷是,只要你的过滤器适用于它的功能是。最后一个例子,使用电子邮件验证-如何处理电子邮件地址改变5.2.14和5.3.3之间FILTER_VALIDATE_EMAIL,即使假设所有的应用程序上运行同一版本的PHP有电子邮件地址,在技术上是有效的,你可能不希望。请确保您知道您所使用的过滤器。
第二个陷阱是,人们认为,如果他们在一些过滤器,然后把他们的代码是安全的。筛选的变量去一些帮助,但它不会使你的代码100%安全不受虐待。我很想谈谈这个问题,但超出了本文的范围和我的字数已经是相当高的!
 
总结:
我想你在你的代码的一个函数,只有一个,看看会发生什么,当你在不同的数据类型和不同的价值观传递。
然后,我想你申请一些在这里讨论的过滤方法,看看是否有在您的代码如何执行差异。我很想知道你是怎么在评论。