为什么大框架忽略了前提条件检查?

时间:2011-05-26 05:02:18

标签: php zend-framework codeigniter

据我所知,检查先决条件是一种很好的做法。如果一个方法需要一个int值,那么使用这样的东西是一个很好的解决方案:

public function sum($input1, $input2) {
if (!is_int($input1)) throw new Exception('Input must be a integer');

然而,在查看Zend / Codeigniter的源代码后,我不经常看到这样的检查。有这个原因吗?

3 个答案:

答案 0 :(得分:3)

因为在使用它之前测试每个变量是困难/低效的。相反,他们只检查输入变量 - 检查门口的访客,而不是一次在屋内。

在使用它们之前测试至少更重要的变量当然是一种很好的防御性编程技术,特别是如果输入来自很多地方。

这有点偏离主题,但我建议的解决方案是测试这样的输入变量:

$username=get('username', 'string');
$a=get('a', 'int');
...

$ _ REQUEST和类似的东西不应该直接使用(甚至可以访问)。

此外,在进行HTML输出时,您应该始终使用:

echo html($username); // replaces '<' with '&lt;' - uses htmlentities

为了避免SQL注入攻击,可以使用MeekroDB,但不幸的是它非常有限(仅限MySQL,仅限单个数据库,......)。它有一个很好的API,虽然促进安全,所以我建议检查出来。 对于我自己,我已经构建了一个基于PDO的小型DB库,并使用预处理语句。 YMMV。

答案 1 :(得分:2)

在任何情况下都没有必要指定这样严格的前提条件,并且在动态类型语言中没有用。

$sum = sum("1", "2");

为什么要禁止它?如果您抛出异常,则会尝试避免它。这意味着,他将测试并投射自己

function sum ($a, $b) {
  if (!is_int($a)) throw new Exception('Input must be a integer');
  if (!is_int($b)) throw new Exception('Input must be a integer');
  return $a + $b;
}

if (!is_int($value1)) { $value1 = (int) $value1; }
if (!is_int($value2)) { $value2 = (int) $value2; }
$sum = sum($value1, $value2);

每次is_int()都会多次出现,以避免不必要的异常。

当你收到它们时,它足以验证值,而不是整个应用程序。

答案 2 :(得分:0)

谈到ZF,我会说他们试图最小化它以支持接口和类。您可以在ZF的许多定义中看到类似这样的内容:

public function preDispatch(Zend_Request_Http $request)

这很好。此外,在需要整数/字符串的关键位置,还有一些健全性检查。但大部分不是is_string()的形式,而是isValidLocale()调用其他类来检查有效性。