【问题标题】:Validate Username and Password separately in PHP ajax在 PHP ajax 中分别验证用户名和密码
【发布时间】:2014-10-16 08:05:14
【问题描述】:

我有一个登录表单。如下:

<form id="myform"  method="POST" class="form_statusinput">
   <div class="input-group">
     <span class="input-group-addon"><i class="fa fa-user"></i></span>
     <input type="email" class="form-control" id="email" name="email" 
      placeholder="Enter email" data-original-title="" title="" 
      onblur="checkEmail()">
      </div>
      <br>
      <div class="input-group">
      <span class="input-group-addon"><i class="fa fa-lock"></i></span>
      <input type="password" class="form-control" id="password" name="password" 
       placeholder="Password" data-original-title="" title="" 
       onblur="checkPass()">
     </div>
</form>       

我在提交表单时通过 Ajax 验证用户名和密码

$(document).ready(function(){ 
  $("form#myform").submit(function(event) {
  event.preventDefault();
  validate();
  });
});

Validate 函数中,对空字符或无效字符进行了正确的验证,但我想向用户返回密码错误或用户名错误的错误。

Ajax 调用如下:

$.ajax({
    url: "includes/fo_submit",
    type: "POST",
    data: dataString,
    success: function (msg) {
        if (msg == 1) {
            $("#loading").hide();
            window.location.reload();
        } else {
            $("#loading").hide();
            $("#messagesuccerr").html("Wrong Credentails")
            .fadeIn().delay(4000).fadeOut();
            return false;
        }
    }
}); 

fo_submit 拥有 PHP 数据库连接和代码

$query = "select * from `register_userfm` where `userchkname_yt` = ? 
and passchk_ty = ?; ";
$result = DB::instance()->prepare($query)->execute(array($_POST['email'],
$_POST['password']))->fetchAll();
if(count($resultfm1)>0){
    echo 1;
}
else{
    echo 0;
}

这种方式唯一返回的错误是“Invalid Credentials”。请告诉我如何分别验证用户名和密码。

【问题讨论】:

  • 你不应该单独验证它们,它会给潜在的攻击者提供有价值的信息!

标签: php jquery ajax validation


【解决方案1】:

您可以通过运行 2 个不同的查询来使用从 PHP 脚本返回的状态代码。类似于以下内容:

$query = "select * from `register_userfm` where `userchkname_yt` = ? and passchk_ty = ?; ";
$result = DB::instance()->prepare($query)->execute(array($_POST['email'], $_POST['password']))->fetchAll();
if(count($result)>0){
    echo "1"; //auth success
}
else{
    $query = "select * from `register_userfm` where `userchkname_yt` = ?;";
    $result = DB::instance()->prepare($query)->execute(array($_POST['email']))->fetchAll();
    if(count($result)>0){
        echo -1; //password wrong
    }
    else{
        echo 0; //username wrong
    }
}

然后您可以检查 ajax 回调中的返回值并采取相应措施。

忠告:向可能的攻击者提供这些信息(他犯了什么错误)可以大大降低暴力/字典攻击所需的时间

【讨论】:

  • 是的..我得到了..很好的建议...现在,如果我想为用户提供查找订单状态的工具,将输入作为订单 ID 和电话号码 r 那么显示会很好订单 ID 错误或 Ph num 错误
  • 如果是在授权之后,他们可以只加载他们的订单是的
  • 则同上。在每种情况下,您都在向具有多个输入的人提供一种访问敏感信息的方法,您应该避免让该人知道他错了什么值
  • ohkies.. 没关系.. 谢谢
猜你喜欢
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
相关资源
最近更新 更多