2014-12-20 91 views
-2

嗨,我只是学习PHP,我开始考虑如何使登录,并使他们的安全。 我有一个问题,我的密码登录,我真的不知道我应该检查它是否在我的数据库中正确的密码。 我已经做到了,所以我在我的数据库中有一个密码密码,但现在我有点失落。我知道如何切盐,但没有把它放在我的代码中。PhP crypt密码检查不起作用

<?php 
if(isset($_POST['namn'])) { 



$username = $_POST['namn']; 
$password = $_POST['pass']; 



    if($username&&$password) { 




    $connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect"); 
    mysqli_select_db($connect, "securedb") or die("Could not connect to db"); 

    $query = sprintf("SELECT * FROM users WHERE namn = '%s' AND password = '%s'", $username,  $password); 

    $result = mysqli_query($connect, $query) or die("error connection"); 



    if(mysqli_num_rows($result) !==0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     $dbusername = $row['namn']; 
     $dbpassword = $row['password']; 



    } 

if($username==$dbusername){ 


    if(hash_equals($dbpassword, crypt($password, $dbpassword))) { 
     header("Location: admin.php"); 
     $_SESSION['name'] = $dbusername; 
    } 
}  

} 

} 

} 

?> 

如果有人能够给我一些提示,会是一个令人费解的问题。

回答

-1

从@保罗Crovella的建议是:

<?php 
$password = $_POST['pass']; 

$选项[ '成本'] = 10; $ hashed_pwd = password_hash($ pass,PASSWORD_BCRYPT,$ options);

?> 

这将创建你的密码哈希值,该值应输入到数据库时,密码被更新,然后检查你这样做密码:

<?php 
$query = "SELECT password FROM users WHERE namn = '%s' LIMIT 1"; 
$output = mysqli_query($connect, $query); 
$cheeckValue = mysqli_fetch_array($output); 

现在,你有密码给在$ _ POST登录[“通”],你必须在$校验值[“密码”]保存在数据库中的密码哈希...

$passLogin = $_POST['pass']; 
if(password_verify($passLogin,$checkValue['password'])){ 

print "Password is correct"; 
} 
    else { 
print "bad password"; 
} 

这并没有解决SQL注入,wher的严重问题eby可以将任何值放入POST语句中,初始视图将运行mysql_real_escape_string和string_replace来查找“和”字符并将其删除。

看到http://php.net/manual/en/function.password-hash.php

编辑:。 SQL注入防止 (这是足够的,但如前所述, - >准备()和 - >执行()处理的更好,请研究

$bad = array("%", "_"); //replace these special characters 
$good = array("\%", "\_"); //with these escaped versions. 
$username = str_ireplace($bad, $good, $_POST['namn']); 
$password = str_ireplace($bad, $good, $_POST['pass']); 


mysqli_set_charset($connect,"utf8"); 
$username = mysqli_real_escape_string($connect, $username); 
$password = mysqli_real_escape_string($connect, $password); 
0

我通过修复一些问题得到了问题,我会发布它,所以你可以看到我是如何做到的 我相信这在许多方面都不正确,但我只是开始如此即时学习...

<?php 
if(isset($_POST['namn'])) { 



$username = $_POST['namn']; 
$password = $_POST['pass']; 



    if($username&&$password) { 




    $connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect"); 
    mysqli_select_db($connect, "securedb") or die("Could not connect to db"); 

    $query = sprintf("SELECT * FROM users WHERE namn = '%s' ", $username); 

    $result = mysqli_query($connect, $query) or die("error connection"); 



    if(mysqli_num_rows($result)){ 
    $row = mysqli_fetch_array($result); 
     $dbusername = $row['namn']; 
     $dbpassword = $row['password']; 

     if($username==$dbusername && crypt($password, $dbpassword) == $dbpassword) { 
     $_SESSION['name'] = $dbusername; 

     header("Location: admin.php"); 

    } 

    } 


    } 


} 

?> 
0

我建议使用password_hash()password_verify()而不是编写自己的代码。如果您有PHP版本< 5.5.0,则有一个兼容性库here

生成初始散列在数据库中存储:password_hash($password, PASSWORD_DEFAULT);

,并与哈希检查密码:

if(password_verify($password, $hash) { 
    header("Location: admin.php"); 
    $_SESSION['name'] = $dbusername; 
} 

请记住,你是不是逃避用户输入和你需要通过在使用$_SESSION之前添加session_start()来启用会话。