Php 保护私有/受保护方法的输入?
正常情况下,所有理智的开发人员都在尝试保护所有公共方法的输入(转换为适当的类型、验证、清理等) 我的问题是:您在代码中是否也验证传递给受保护/私有方法的参数?在我看来,如果您正确地将公共方法的参数安全化并从外部返回值(其他类、db、用户输入等),则没有必要这样做Php 保护私有/受保护方法的输入?,php,security,frameworks,Php,Security,Frameworks,正常情况下,所有理智的开发人员都在尝试保护所有公共方法的输入(转换为适当的类型、验证、清理等) 我的问题是:您在代码中是否也验证传递给受保护/私有方法的参数?在我看来,如果您正确地将公共方法的参数安全化并从外部返回值(其他类、db、用户输入等),则没有必要这样做 但我经常面对框架和应用程序(比如prestashop),在这些框架和应用程序中,验证经常在方法调用、方法体中重复,并再次用于安全化返回值——我认为,这会造成性能开销,也是设计不好的标志。没错-如果你的应用程序设计得很好,那么就没有必要了
但我经常面对框架和应用程序(比如prestashop),在这些框架和应用程序中,验证经常在方法调用、方法体中重复,并再次用于安全化返回值——我认为,这会造成性能开销,也是设计不好的标志。没错-如果你的应用程序设计得很好,那么就没有必要了 对于protected,我认为您应该验证它们,因为该方法稍后可能被重写或从另一个类调用,并且您不能假定该方法的有效输入。如果这是一个将由其他应用程序使用的组件,则尤其如此
对于private,我认为这是一种浪费,因为您可以控制传递给方法的内容,因此在调用private方法之前,应该先验证数据。如果您坚持认为公共API应该有针对坏参数进行保护的实现,您的标准不应该是方法的可见性,而是API的用户是否将直接调用该方法(或通过另一个延迟验证的方法间接调用该方法) 应进行验证的方法示例:
class A {
protected final function myMethodDefaultImplementation(...) {
/* subclasses can just call this method in their myMethod implementations */
/* should do validation */
...
}
protected abstract myMethod(...);
public function orderByDate() {
return $this->orderBy(ORDER_BY_DATE)
}
private function orderBy($crit) {
/* should do validation */
...
}
}
仅在最后一次可能的机会对输入进行清理。我看不出OO语义有什么不同 例如,如果出于某种原因,您不能使用参数化查询或ORM(我现在能想到的一个例子:),那么您可以这样编写函数:
function getname($id) {
$id = intval($id);
mysql_query("SELECT * FROM users WHERE id = $id");
...
}
现在,任何代码都不可能调用此函数并导致意外结果。我想说,无论它是什么类型的方法(公共、私有、受保护),在需要时,您可以采取适当的预防措施,而不必查看可见性关键字。除非您使用正则表达式(您不应该使用正则表达式),否则验证不会带来很大的性能开销。我看到过非常糟糕的验证,即在前面提到的prestashop中,他们的ORM中有方法isTableOrIdentifier,它使用regexp来检查表/列名的有效性,并且在一个对象内被逐字地调用几十次(想象一下现在导入数百或数千个对象),如果您正在进行适当级别的单元测试,那么跳过一些私有成员的验证就可以了。总有风险,但如果你的;或者是一个评论员;对代码的检查表明,基于调用公共成员的行为,您的下游假设将始终是正确的,那么这就没问题了。为什么要投否决票?就是这样做的。创建允许您注入SQL的API毫无意义。更不用说,这与公认的解决方案完全相同。