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[] 获取数据