Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 保护私有/受保护方法的输入?_Php_Security_Frameworks - Fatal编程技术网

Php 保护私有/受保护方法的输入?

Php 保护私有/受保护方法的输入?,php,security,frameworks,Php,Security,Frameworks,正常情况下,所有理智的开发人员都在尝试保护所有公共方法的输入(转换为适当的类型、验证、清理等) 我的问题是:您在代码中是否也验证传递给受保护/私有方法的参数?在我看来,如果您正确地将公共方法的参数安全化并从外部返回值(其他类、db、用户输入等),则没有必要这样做 但我经常面对框架和应用程序(比如prestashop),在这些框架和应用程序中,验证经常在方法调用、方法体中重复,并再次用于安全化返回值——我认为,这会造成性能开销,也是设计不好的标志。没错-如果你的应用程序设计得很好,那么就没有必要了

正常情况下,所有理智的开发人员都在尝试保护所有公共方法的输入(转换为适当的类型、验证、清理等)

我的问题是:您在代码中是否也验证传递给受保护/私有方法的参数?在我看来,如果您正确地将公共方法的参数安全化并从外部返回值(其他类、db、用户输入等),则没有必要这样做


但我经常面对框架和应用程序(比如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毫无意义。更不用说,这与公认的解决方案完全相同。