对于具有相同输入参数的两个函数(一个在另一个内部使用),在哪里清理输入参数?

时间:2015-02-02 20:57:10

标签: php database sanitization

对于下面的两个函数,函数A使用函数B,它们采用相同的参数 - $ input。这个$ input参数是应该在A内还是在B内消毒?还是应该对它们进行消毒? (冗余?)

什么是最好的编码习惯?谢谢!

function A($input) {

    // Sanitize $input here?

    B($input);

    // Does its own thing

}

function B($input) {

    // Sanitize $input here?

    // eg. SQL statement using the $input
    eg. "SELECT * FROM table1 WHERE column1 = $input"

}

编辑:我更具体一点,所以你知道B的功能。 (例如,假设它使用$ input作为SQL语句的一部分。

2 个答案:

答案 0 :(得分:0)

取决于输入和您想要消毒的内容。如果你要在两个函数中对它进行消毒,那么至少sanitize正在使用第三个函数。因此它被平等处理,当你必须改变它时,你必须在一个点上改变它。

您还可以使用类型提示:PHP: Type Hinting

答案 1 :(得分:0)

在一个单独的,可能是私有范围的函数中清理输入,在调用它的其他函数的开头调用它。这将允许一致性,并且如果您需要添加可能还需要清理相同类型/范围的输入的额外功能,则将该清理重构为该单独功能将降低所需的工作水平。

在可能的情况下,您应该使用type hinting - 其中一个优点是现代IDE在输入调用这些函数的代码时会使用它来弹出提示。

此外,作为清理/验证输入值的一部分,我建议您抛出运行时异常的子类,以指示该输入的验证错误,例如:

class My_RuntimeException extends RuntimeException {} 

function A($input) { 
    $s = sanitise_input($input); 
    // do main work... 
}
function B($input) {
    $s = sanitise_input($input); 
    // do main work of this function... 
}

function sanitise_input($input) {
    if (!is_numeric($input)) {
        throw new My_RuntimeException("$input must be numeric.");
    }
    if ($input < MIN_RANGE && $input > MAX_RANGE) {
        throw new My_RuntimeException("$input outside of range.");
    }
    $sanitised = (int) $input;
    return $sanitised;
}

这样,您不依赖于神秘的返回值来指示输入值可能出现的问题,您可以返回实际的已清理输入参数。