过度安全是好还是坏?

时间:2010-10-08 01:52:04

标签: security oop functional-programming coding-style

如果一个函数在里面进行了所有正确的检查,我应该在调用之前检查所有内容,还是最好不要?安全冗余被认为是一种好的做法吗?

示例(在一种类似C#的伪代码中,通过引用参数传递):


doSomething(vector v) {
  ...;
  v.clear;
  useCleanVector(v)
}

useCleanVector(vector v) {
  if(!v.isClean) v.clear;
  ...
}

4 个答案:

答案 0 :(得分:4)

最重要的是,您以明显的方式记录您的先决条件和特殊情况。这样的事情似乎很明智。

/**
 * precondition : id must be the id of a flarg.
 * 
 * myfunc will return -1 if value is outside the valid 0-10 range.
 */
int myfunc( int id, int value );

这让我可以编写类似这样的代码

 int flarg_id = ...
 if (! is_flarg( flarg_id ) ) { printf("Bad flarg"); exit(1); }
 int value = ...
 int rv = myfunc( flarg_id, value );
 if( rv == -1 )  { printf("Bad value"); exit(1); }

答案 1 :(得分:1)

有冗余(通常很好),并且重复自己。

借用Josh的例子,如果函数Foo保证它清除向量,则没有理由事先清除它。信任并验证您的API提供的保证。

另一方面,即使您确信数据访问界面完全抵御任何恶意活动(您自己检查了条件前后的每个程序!),也没有理由将该表面暴露给未经授权的用户。找到你的瓶颈,并保护这些瓶颈,以防更深层次的代码存在你还不知道的漏洞。

答案 2 :(得分:0)

我说这是糟糕的形式。不是很糟糕的形式,而是导致这种形式的同一种形式:

 v.clear(); // clear the vector to be safe. 
 v = v2;

如果你的方式是重现已经在函数中的代码,那么你首先要把它放在函数中来节省时间。如果对函数的每个调用具有相同的前导码,则违反DRY概念。

最好了解函数检查的内容以及不执行的操作,并相应地使用它。

答案 3 :(得分:0)

是的,您应该始终在该范围内执行所需的检查。

原因?当有人在n个月之后进来时,他们不会按照功能调用到最后一项。确保每个功能本身都受到保护将有助于缓解愚蠢的错误,或者更糟糕的是,这些错误很难被追踪。