【问题标题】:POST sanitizing and avoiding nested if blocksPOST 清理并避免嵌套 if 块
【发布时间】:2017-09-11 16:34:37
【问题描述】:

在清理从控制器传递到模型的 $_POST 时,我需要清理输入,我可以想到 2 个选项。

对于第一个,我可以像这样嵌套if 块:

if(!empty($username))
{
            if(!empty($password))
            {
              //login the user
            }
            else 
            {
                echo 'Please enter password.'
            }
 }
 else 
 {
    echo 'Please enter username.'
 }

另外一个是这样的:

   if(empty($username))
    {
        $err[] = 'Please enter username';                
    }
    if(empty($password))
    {
        $err[] = 'Please enter password.';                
    }
    if(empty($err)){
        //login the user
    }
    else
    {
        //display error
    }

哪种方式是首选方式,是否还有另一种更智能的输入净化方式?

【问题讨论】:

  • 完全自以为是,我现在将证明:[在此处插入人员[s name]的首选方法是if (!empty($username) && !empty($password)),而不是嵌套。
  • 仅凭个人经验,我的项目是这样设置的:if( empty($username)) throw new LoginException('Please enter username.'); if(empty($password)) throw new LoginException('Please enter password.'); ... - 有些人可能会指责我滥用异常,但它工作得很好。
  • @NiettheDarkAbsol 我指责你有不同的意见,从而更加证明了我的观点!
  • @Script47 好的,我明白你的想法,但我希望能够具体说明哪些输入未通过验证,而不是说“有问题”,另一件事是在注册新用户时,每个数据正在经历不同的清理 - 对于用户名 - 首先如果它不为空,然后如果它包含受限字符,用户名的长度,如果用户名被使用等等。所以我不能将它们组合在一起如果声明。

标签: php


【解决方案1】:

简单可以使用:

$errors = [];
if(!isset($_POST['username']) || empty($_POST['username'])) {
    $errors[] = 'Please enter valid username';
} else if(!isset($_POST['password']) || empty($_POST['password'])) {
    $errors[] = 'Please enter valid password';
}

filter_var 可用于过滤特定输入。

【讨论】:

  • 如果输入字符串是' '呢?
  • 将用户名和密码组合在一个 if 语句中不是我想要的。在注册用户 $username 时,将进行一些检查 - 如果用户名被使用,其长度,是否包含受限字符等。然后我将有多个 if 语句。我想我的例子并不理想。
  • 使用空。更精确
  • @Akintunde 回答者正在使用empty。他们需要使用trimempty
  • 处理表单数据的最佳和推荐方法是使用 filter_has_var 和 filter_var 函数。请查看这些函数的文档。
【解决方案2】:

这不是消毒,您只是检查输入中是否有任何字符。清理是为您的表单获取确切类型的值。

如果是你的问题,如果你可以创建一个预期输入名称的数组

$desiredInputs = array('username','password','etc');
$errors = [];
foreach ($desiredInputs as $input) {
    if(!isset($_POST[$input]) || empty(trim($_POST[$input])){
        $errors[] = $input.' is not set or empty';
    }
}

要进行消毒,您可以查看以下答案; https://stackoverflow.com/a/34760018/502649

另外,消毒的最佳做法是 RegExfilter_var

【讨论】:

  • 我知道这不是完全消毒。我举了一个简单的例子,但$username 将进行一些检查 - 如果用户名被使用,它的长度,是否包含受限字符等。然后我会有多个 if 语句。
  • 而不是$_POST[$input] == '' 使用empty,因为前者很冗长。
  • 如果输入字符串是' '呢?
  • 如您所见@Script47 纠正我:),您可以编写一个函数来专门检查您需要检查的内容。例如,一个名为 validate($inputToValidate,$expectedType) 的函数,因此您可以使用正则表达式来检查它是电子邮件、空还是其他。预期类型可以是电子邮件、IP 电话、数字、字母数字等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多