哪种方式更好地验证php中的用户名和密码

时间:2015-07-14 21:04:06

标签: php mysql

假设我们正在编写登录系统,我们想检查用户提供的用户名和密码是否匹配。

来自浏览器的数据是:

$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
  • 这样做的一种方法是从数据库中检索数据,然后将它们与来自用户的数据进行比较。

    $sql = "SELECT username FROM users WHERE username=:username";
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':username', $username);        
    $stmt->execute();
    //...
    
    if($password = $dbpassword){
      //...
    }
    
  • 另一种方法是直接查询数据库(通过将变量嵌入到查询语句中),然后使用rowCount()查看是否有任何带有给定用户名和密码的记录。

    $sql = "SELECT username FROM users WHERE username=:username AND password=:password";
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':password', $password);
    $stmt->execute();
    $numRows = $stmt->rowCount();
    

我想知道哪种方式更好,为什么?

2 个答案:

答案 0 :(得分:2)

确认查询数据库是一项非常繁重的操作,您应该尽可能少地查询。所以第二个解决方案很好(只有一个查询)。

如果rowcount返回0,则表示数据库中没有对应的用户名*密码。

编辑: 始终进行更准确的查询。如果您的数据库在没有附加查询的情况下可以执行相同操作,则无法在Php端添加代码。

答案 1 :(得分:0)

这取决于您用于存储密码的哈希 - 对于某些高级方法(如http://api.nette.org/2.2.0/source-Security.Passwords.php.html#24-49),您应该使用第一个选项,因为您需要存储哈希来验证密码。