【问题标题】:Checking unsanitized POST values检查未经处理的 POST 值
【发布时间】:2017-03-18 22:09:07
【问题描述】:

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

我的问题是,使用未经处理的值做任何事情是否安全?安全隐患是否只有在显示值时才会显现出来?

具体来说,做代码之类的会不会有什么问题

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

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

目前我会在检查所有输入是否为空之前对其进行清理,但我想避免在这种情况下出现错误/警告,例如,如果用户提交了一个空白框(因为可以对不存在的 POST 值调用清理函数存在)

【问题讨论】:

标签: php


【解决方案1】:

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 的内置函数,这就是您需要做的。

来源:

【讨论】:

    【解决方案2】:

    始终首先检查未定义的变量。

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

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

    $bingo = isset($variable);
    

    【讨论】:

    • 说它是preferable, too,语法很糟糕。如果它是优选的,则该词意味着它是优选的,因此它具有更高的优先级。而您对too 一词的使用意味着它具有平等性。那么使用isset首选还是一个好方法(同等)?
    • 我的不好,在陈述那句话时。
    • 好消毒从存在开始,所以为了安全起见,请务必执行此检查,或者说这个概念是错误的?
    【解决方案3】:

    通常您要首先检查是否定义了变量。您可以通过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】:

      您的示例中的错误是您在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;
      

      【讨论】:

        【解决方案5】:

        结帐filter_varfilter_input

        【讨论】:

          猜你喜欢
          • 2010-11-08
          • 2014-06-04
          • 2021-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多