代码之家  ›  专栏  ›  技术社区  ›  Nitin

如何安全地检查superglobal post[‘key’]的类型?

php
  •  0
  • Nitin  · 技术社区  · 5 年前

    如何安全地检查SuperGlobal Post[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 回复  |  直到 5 年前
        1
  •  1
  •   Progman    5 年前

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

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

    当您根据类型“string”和“array”检查变量时,您处理了所有可能的类型。

        2
  •  1
  •   Elisha Senoo    5 年前

    使用 isset() 函数加上您想做的任何检查都将使它“更安全”,因为如果没有设置或定义变量或索引,代码就不会被破坏。

    is set_

    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);
    
        }
    }