2011-10-11 114 views
4

当我写下一个功能是验证功能的这样所有参数一个很好的做法:是否需要验证函数参数?

<?php 
/** 
* foo - Test function 
* 
* @param int $paramA 
* @param str $paramB 
* @param array $paramC 
* 
* @return something 
*/ 
function foo($paramA, $paramB, $paramC) { 
    // verify all parameters 
    if(!is_int($paramA)) { 
     return 0; // or error msg 
    } 
    if(!is_string($paramB)) { 
     return 1; // or error msg 
    } 
    if(!is_array($paramC)) { 
     return 2; // or error msg 
    } 

    // some code in function scope that uses parameters 
    // and saves the results in $result 
    return $result; 
} 

或者我应该依赖于将使用功能和假定他知道他是什么样的用户做和忘记参数验证?

我个人更喜欢验证函数的所有参数,并返回代码的一致性错误代码,并使我的生活更轻松。

预先感谢您。

+0

是的,当然这是......一个很好的做法。 **必要**?那么... –

回答

0

如果它是一个内部函数,只有你会使用,那么可能没有验证每一个单一的参数。如果它是具有取决于用户输入的参数的函数(例如,通过$_GET获得信息,然后将其传递给函数),则需要验证它。

永远不要依靠用户或除自己以外的任何人知道他们在做什么。如果您正在编写可以稍后重用的代码(例如,如果您正在编写自己的框架以便在所有PHP项目中使用),有时候验证这样的事情会有帮助。但是,如果它只是一个特定于应用程序的功能,只有你可以用只有你定义的参数调用,我才不会担心。

+0

至于你的第二句,第一段:它*是* **必要**总是验证,清理,转义,转换和/或以其他方式*证明*提交的数据是它应该是和没有“不必要的”内容。 –

+0

当然。为了清楚起见,我将“应该验证”改为“需要验证”。 –

+0

特别是'$ _GET',不验证用户输入可能会导致一个很大的安全漏洞。 – John

0

为什么验证参数:

  • 有时候我们确实需要对操作有一定的数据类型。如果你给我一个不能代表整数的字符串,并用它来搜索数据库中的主键(通常是一个int),那么你将遇到麻烦。
  • 它使修复代码更容易。当您检查参数时,您可以抛出单个异常并给出非常具有描述性的消息。这样可以在事件中断时更轻松地修复代码,因为您确切知道哪里出了问题。

的类型检查的一些技巧:

  • 如果你不知道,is_int是相当错误的。我认为一个有效的检查是否是一个int是is_numeric($int) && $int==(int)$int
  • 您可以指定对象和数组的类型,如下所示:function foo($paramA, $paramB, array $paramC)
+0

我个人希望在PHP中有一个很好的'assert()'。 –

+0

而且,为什么http://fluffykittypics.com没有用C++编写,可能有很好的理由。 –

+0

谢谢您的信息,我不知道is_int是错误的。 – Starlays

0

真的取决于你对这些参数做什么的类型严格性。

由于PHP是弱类型的,因此您可以通过强制转换或者让隐式类型转换/强制转换来实现。

如果你只是在每个函数的头部抛出一堆警戒条件来返回错误,那么它与PHP触发错误本身并没有多大区别。

+0

如果你只是想在每个函数的头部抛出一堆警戒条件来返回错误,那么这与PHP触发错误本身并没有什么不同。 你是什么意思? PHP如何触发我的函数参数错误?我很困惑。 谢谢。 – Starlays

+0

你不能依靠自动转换。你应该做基本检查。它是否是'1'或'1'并不重要,但如果您期待'1'并获得''id1'',这将会很重要。 –

2

我想答案是:这取决于

这取决于你是谁编写代码。如果你正在寻找的最广义的答案,然后,你应该。

如果你的脚本将只由你使用,你在你的心中,你总是会正确地使用它的心脏知道,那么你将(可能),如果你不这样做是安全的。

如果你的脚本是将被分发到很多很多人的API的一部分,那么你最肯定要添加错误检查和为人们提供良好的回落错误消息。

如果你是将全部使用相同的代码一个小团队的一部分,我还建议,根据您的特定上下文验证你的论点将是一个不错的主意。

+0

-1,它不依赖。你检查这些参数。你每次都检查它们。你不相信任何人,甚至不相信你自己。 –

+0

@LeviMorrison我不同意你的看法。首先,检查每个函数中的每个参数肯定会增加代码长度以及编码所需的时间。这可能会导致大型项目浪费大量时间。另外,当值通过应用程序时,您将一遍又一遍地检查相同的参数。过早优化显然是不好的,但我猜这可能会导致一些性能开销。 – gilden

+0

@Gilden哦,编码需要更长的时间,并且可能会给代码增加一些负担。当你不检查你的参数时,在C++中会发生什么?分割错误。当你不检查你的参数时,PHP会发生什么?未知的结果。在某些方面,这比seg故障更糟糕。 。 。 –

0

我不同意。我最近偶然发现了一个类似问题(空检查)an article,但它似乎也适用于php中的类型检查。我同意作者的观点。

  • 以使得类型检查冗余的方式编写代码。
  • 明确地验证用户输入和尽可能快投值到所需的类型。
  • 在某些特殊情况下,您可以并应该使用异常而不是返回一些模糊的错误编号。
+0

你的链接已经死机 –

+0

谢谢指出,我修好了。 – gilden

0

这是验证函数参数一个很好的做法。我怀疑你问这个问题,因为另一方面它会让你的功能看起来更长,更丑。然而,从NSPL开始args module,这很容易做到。您示例中的功能将为:

function foo($paramA, $paramB, array $paramC) 
{ 
    expects(int, $paramA); 
    expects(string, $paramB); 

    // do something 
} 

// or type check several arguments 
function sum($x, $y) 
{ 
    expectsAll(numeric, [$x, $y]); 
    return $x + $y; 
} 

更多示例here