函数或调用者是否应负责输入验证?

时间:2010-06-07 19:50:32

标签: php security user-input

我正在对一个相当大的php应用程序进行安全审核,并想知道我应该在哪里包含我的用户输入验证。

我应该验证数据,然后将干净的数据发送到后端函数,还是应该依靠每个函数来进行自己的验证?或者两者兼而有之?

这种事情是否有任何标准或最佳做法?

目前,该应用程序不一致,我希望使事情更加一致。

5 个答案:

答案 0 :(得分:8)

两者都是更好的答案。数据验证应该在每个将处理数据的函数中进行,以避免Hope Driven Development(HDD

的问题

答案 1 :(得分:6)

您应该尽快从外部验证数据。根据体系结构,负责函数内的后端验证可以是第二步,但不依赖于后端验证,而是在数据进入应用程序时对其进行验证。

在函数内部验证的专业人员作为对先前验证的补充,因为维护系统更容易(也更安全),因为(无比的)开发人员在您无法破坏应用程序之后。如果您有一个支持插件的应用程序,例如对于第三方插件,安全功能也是必须的。

答案 2 :(得分:2)

我认为如果你可以同时做这两件事,时间/资源不是问题,为什么不呢?

答案 3 :(得分:2)

这取决于应用程序的范围/定义。但传统上,你的函数用于可能的地方$ object-> doSomething()就是这样做的。依靠那里的验证,你可以阻止你的OWN协议的一些事情,你知道吗?

如果你在外面进行验证,你可以轻松管理它。无需在特定的内部功能中搜索它。保持OOP,但更像是

$ data = $ validator-> sanitizeSomething($ data); $对象 - > doSomething的($数据);

这可以使您的验证规则保持独立,易于管理以及内部功能。

详细说明,假设您有一个向表中添加数组的db对象:

class db {
   function addRow($table, $associativeArray) {
      // primitive i know, just an example 
   }
}

您希望在那里进行验证吗?

function addRow($table, $associativeArray) {
    if( isset( $assiciativeArray['description'] ) {
       // validate
    }
}

会很愚蠢 - 你想要在你正在使用的对象中

class product {
   function update() {
       if( $this->validate() ) {
          $this->db->addRow($this->toArray()); // or something, you get the idea, ya?
       }
   }
   function validate() {
      if( $this->description != "") {
         return true;
      }
      return false;
   }
}

答案 4 :(得分:2)

在后端验证就像在登机后登机。验证的重点是防止注入可能会阻碍您的应用的元素。因此,您必须在进入大门之前进行验证:)