我正在对一个相当大的php应用程序进行安全审核,并想知道我应该在哪里包含我的用户输入验证。
我应该验证数据,然后将干净的数据发送到后端函数,还是应该依靠每个函数来进行自己的验证?或者两者兼而有之?
这种事情是否有任何标准或最佳做法?
目前,该应用程序不一致,我希望使事情更加一致。
答案 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)
在后端验证就像在登机后登机。验证的重点是防止注入可能会阻碍您的应用的元素。因此,您必须在进入大门之前进行验证:)