检查未过滤的POST值

时间:2017-03-18 13:32:57

标签: php

我刚刚启动PHP并且有一个用户可以提交数据的表单。在显示或发送数据之前,它会被清理并验证(trim,stripslashes和htmlspecialchars)并保存为新变量,然后使用这些变量代替直接提交的值。

我的问题是,对未经过抽样化的价值做任何事都可以安全吗?只有在显示值时,安全隐患才会变得明显吗?

具体来说,执行

等代码会有任何问题

if(empty($_POST["theirname"]){code;}

如果他们在提交时尝试某种攻击或将代码放入该框中?

目前我在检查它们是否为空之前清理所有输入,但是我想在这种情况下避免错误/警告,例如,如果用户提交一个空白框(因为可以在POST值上调用清理功能) ; t存在)

5 个答案:

答案 0 :(得分:2)

PHP的filter_*函数。它们是对每个变量进行消毒的函数,无论是服务器变量(如$ _SERVER,$ _GET,$ _POST,$ _REQUEST)还是您自己的变量。
由于您要清理$_POST,以下是您应该使用的内容:

$theirname = filter_input(INPUT_POST, "theirname");
if (!$theirname) {
    echo "theirname is invalid!";
} else {
    // your code
}

filter_input可以检查变量是否存在,是否为空,以及是否有任何可以使您的代码/网站易受攻击的内容(HTML标记注入,JS代码注入,通过评估注入PHP代码等) 。这比自己检查更好。

当然,如果您决定不信任filter_*函数,您可以随时自行检查,在这种情况下,您需要:

  • 使用is_null检查变量是否存在和/或检查NULL;
  • 检查变量是否为空;
  • 检查变量是否包含特殊字符(并正确转义);
  • 检查变量是否包含HTML或XML标记(并转义/删除它们);
  • 检查变量是否包含JS代码或脚本标记(并转义/删除它们);
  • 检查变量是否包含PHP代码,以及是否尝试通过eval执行该变量;

正如您所看到的,它是一个广泛的列表,如果您不想依赖PHP的内置函数,那就是您需要做的事情。

来源:

答案 1 :(得分:0)

首先检查未定义的变量。

if(!is_null($_POST["theirname"])){


if(empty($_POST["theirname"]){code;}

}

绝对需要检查是否存在任何变量。

$bingo = isset($variable);

答案 2 :(得分:0)

您的示例中的错误是您if判断中缺少

//Your code
if ( empty($_POST["theirname"]) { code; }
                              ^^
//Code updated
if (empty($_POST["theirname"])) { code; }

在检查您的输入是否为empty之前,您可以检查您的表单是否已定义且不是NULL

示例:

//Reset.
$msg = $theirname = NULL;

//Check if the form is defined.
if (isset($_POST)) {
   //Check input empty.
   if(empty($_POST['theirname'])) {
      $msg = 'Inputs are required';
   } else {
      $theirname = data_filter($_POST['theirname']);
   }
   //check $theirname.
   if ($theirname) {
      //Do something with $theirname...
   }
}

//Filter function.
function data_filter($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

//Message.
echo $msg;

答案 3 :(得分:0)

通常,您要首先检查是否定义了变量。您可以if(!is_null($_POST["theirname"]))执行此操作 如果已定义,那么您可能想检查它是否为空,如果没有,则执行一些操作。 (例如消毒和/或验证)

if(!is_null($_POST["theirname"])){


  if(!empty($_POST["theirname"])
  {
    //Do some stuff here
  }
  else
  {
    //send notification that the user didn't input any data
  }
}

答案 4 :(得分:0)