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


For two functions (one is used inside another) with the same input argument, where to sanitize the input argument?

对于下面的两个函数,函数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 语句的一部分。

取决于输入和您要清理的内容。如果您要在两个功能中对其进行消毒,那么至少清理正在使用第三个功能。这样它就可以得到平等的处理,当你必须改变它时,你必须在某一点上改变它。

您也可以使用类型提示: PHP:类型提示

清理一个

单独的、可能是私有作用域的函数中的输入,并在调用它的其他函数开始时调用它。这将允许一致性,并且如果您还需要添加可能还需要清理相同类型/范围的输入的额外功能,并且重构对该单独函数的清理将减少所需的工作量。

在可能的情况下,您应该使用类型提示 - 其中一个优点是现代 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;
}

这样,您就不会依赖神秘的返回值来指示输入值可能存在的问题,并且可以返回实际经过净化的输入参数。