php过滤输入,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之间的整数。

会是这样做的方法之一:

复制代码 代码如下:

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()函数是有效的,因为各种语气词它的问题。

最后,我们必须与事实问题,如果声明是了一口采取位,是一个额外的逻辑位通过当你通过代码跟踪工作。

现在比较上面的例子:

复制代码 代码如下:

$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()做同样的事情。

复制代码 代码如下:

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

//那将是愚蠢的。

function emailUser($email) {

mail($email, "Here is my email", "Some Content");

}

这里的危险是,有没有试图发送一封电子邮件,从字面上任何值可以存储在停止邮件()函数$电子邮件。这可能会导致无法发送电子邮件,或东西越来越可能在最坏的情况下使用的恶意功能。

我所看到的人做的 ??结果支票的mail() ,这是很好看,如果该函数成功完成,但损害的是时间值返回。

像这样的东西是更加理智:

复制代码 代码如下:

// 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%安全不受虐待。我很想谈谈这个问题,但超出了本文的范围和我的字数已经是相当高的!

总结:

我想你在你的代码的一个函数,只有一个,看看会发生什么,当你在不同的数据类型和不同的价值观传递。

然后,我想你申请一些在这里讨论的过滤方法,看看是否有在您的代码如何执行差异。我很想知道你是怎么在评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值