如何安全检查超全局POST ['key']的类型?

时间:2018-11-14 20:16:36

标签: php

如何安全检查超全局帖子[key]的类型? 例如,我有以下代码:

$ufo = false;
if (filter_has_var(INPUT_POST, 'key')) {

    if (is_string($_POST['key'])) { // <- IS THIS SAFE?

        $ufo = filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING);

    } elseif (is_array($_POST['key'])) { // <- IS THIS SAFE?

        $ufo = filter_input_array(INPUT_POST, 'key', FILTER_SANITIZE_STRING);

    }
}

是否有更安全的方法来检查发布的变量的类型?

2 个答案:

答案 0 :(得分:1)

isset()函数与您要执行的任何检查一起使用将使其更加“安全”,因为如果未设置或定义变量或索引,代码不会被破坏。

  

isset —确定是否设置了一个变量,并且该变量不是NULL

PHP Docs

在这方面,您可以按以下方式重写代码:

$ufo = false;
if (isset($_POST['key'])) {

    if (is_string($_POST['key'])) { // <- IS THIS SAFE?

        $ufo = filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING);

    } elseif (is_array($_POST['key'])) { // <- IS THIS SAFE?

        $ufo = filter_input_array(INPUT_POST, 'key', FILTER_SANITIZE_STRING);

    }
}

答案 1 :(得分:1)

外部变量的类型将始终为字符串或数组,如http://php.net/manual/en/language.variables.external.php#language.variables.determining-type-of所述:

  

HTTP是一种文本协议,Superglobal数组中的大多数(如果不是全部)内容(如$_POST$_GET)将保留为字符串。 PHP不会尝试将值转换为特定类型。

当您针对“字符串”和“数组”类型检查变量时,您处理了所有可能的类型。