PHP 如何以正确的方式过滤所有 $_POST 变量

Posted

技术标签:

【中文标题】PHP 如何以正确的方式过滤所有 $_POST 变量【英文标题】:PHP How to filter 'in a correct way' All $_POST variables 【发布时间】:2017-10-25 05:17:06 【问题描述】:

使用 Netbeans,每当我尝试访问 $_POST 或 $_GET 中的变量时,建议我使用类似:filter_input(INPUT_POST,'id'),用于“安全”(我不认为它比使用 filter_input 更安全)默认的 NON 过滤器,但无论如何..)。

这让我想到了这个帖子的答案:How to grab all variables in a post (php)

你有:

foreach ($_POST as $key => $value) 
    //do something
    echo $key . ' has the value of ' . $value;

filter_input() 仅适用于 $_POST 中的单个变量

我的问题是,我如何通过过滤重新编写“$_POST as $key”以符合 NetBeans 告诉我的这个假定访问标准?

【问题讨论】:

您知道,您可以在 Netbeans 中关闭该警告。 @Don'tPanic 我知道,我也可以不看红绿灯过马路 问题是,在不知道您需要的特定类型的过滤器的情况下,无论如何您都只需要使用“默认的非过滤器”,这并不比关闭警告更安全。如果你确实知道你需要什么类型的过滤器,那么 filter_input_array 实际上会很有用。 【参考方案1】:

您可以使用filter_input_array 过滤整个$_POST

$safePost = filter_input_array(INPUT_POST);

使用第二个参数可以改变过滤器

$safePost = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

您还可以定义每个属性的过滤器

$safePost = filter_input_array(INPUT_POST, [
    "id" => FILTER_VALIDATE_INT,
    "name" => FILTER_SANITIZE_STRING,
    "email" => FILTER_SANITIZE_EMAIL
]);

如果我对输入一无所知怎么办?

你总是知道一些事情,你知道你期望得到什么。 如果用户提供了无效的输入,您应该对此做出反应。

如果您希望 id 字段中有一个整数,而用户向您发送了 tomato,那么您应该回复一个错误,告知用户他们发送的请求有什么问题。

【讨论】:

您将如何解决“如何在帖子中获取所有变量 (PHP)”帖子中提到的关于未知变量名称和数量的情况,例如我可以有“id”,名称","email1","email2"...."email.......X"。我怎么能用这个功能过滤那些 @ndelucca 您可以使用单参数调用$safePost = filter_input_array(INPUT_POST);,您将从POST 中获取所有变量 @ndelucca 是的,它将使用FILTER_DEFAULT,这意味着根本不过滤,但 NB 应该停止抱怨。如果您对预期输入一无所知,则无法正确过滤/清理它,如果您确实知道某些内容,则使用带有 2 个参数的调用进行过滤 @mleko 你能帮帮我吗?我处于同样的情况。我的$_POST 是多提及数组,它有多个数组,如$_POST[array1], $_POST[array2], $_POST[array3], $_POST[array4] ..... 每个数组由一些字符串变量组成。我如何过滤这个帖子数组? @santosh 如果我理解正确的话。您可以使用php.net/manual/en/function.filter-var.php。例如$safePost = filter_var($_POST['key1']['key2']);如果这不是您需要的,请提供更多详细信息或一些示例【参考方案2】:

你可以使用类似的东西:



        $methods = (string)$_SERVER['REQUEST_METHOD'];

        $vars_dl = [];

        if( in_array( $methods, ['POST', 'GET'] ) ) 

            switch( $methods ) 

                case 'POST':

                    $post_vars = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING | FILTER_SANITIZE_FULL_SPECIAL_CHARS | FILTER_SANITIZE_ENCODED, FILTER_REQUIRE_ARRAY ) ?? [];

                    $vars_dl = [ $post_vars, 'p' ];

                    break;

                case 'GET':

                    $get_vars = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING | FILTER_SANITIZE_FULL_SPECIAL_CHARS | FILTER_SANITIZE_ENCODED, FILTER_REQUIRE_ARRAY ) ?? [];

                    $vars_dl = [ $get_vars, 'g' ]; 

                    break;

            

        
        else 

            exit('<h1>ACCESS Exception :: method '. $methods .' blocked!</h1>');

        

【讨论】:

以上是关于PHP 如何以正确的方式过滤所有 $_POST 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何以 PHP 形式从特定表 html $_POST[] 获取数据

PHP 如何保存/打印 整个Http请求头和附带的post数据?

如何使用 GoAccess 正确过滤我的访问日志?

如何正确转义过滤的内容变量?

如何在 PHP 中正确连接

如何以编程方式确定 PHP 中的文档根目录?