对于下面的两个函数,函数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语句的一部分。
答案 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;
}
这样,您不依赖于神秘的返回值来指示输入值可能出现的问题,您可以返回实际的已清理输入参数。