您好我正在学习php,我开始研究如何登录并使其安全。 我的密码登录有问题,我真的不知道如何检查我的数据库中是否有正确的密码。 我已经做到了,所以我的数据库中有一个密码,但现在我有点丢失了。我知道如何去盐,但不知道在我的代码中放置它。
<?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;
}
}
}
}
}
?>
如果有人能给我一些提示,那会很棒。
答案 0 :(得分: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");
}
}
}
}
?>
答案 1 :(得分:0)
我建议您使用password_hash()和password_verify()而不是编写自己的代码。如果您有PHP版本&lt; 5.5.0,有一个兼容性库here。
生成要存储在数据库中的初始哈希:password_hash($password, PASSWORD_DEFAULT);
并使用哈希检查密码:
if(password_verify($password, $hash) {
header("Location: admin.php");
$_SESSION['name'] = $dbusername;
}
请注意,您没有逃避用户输入,并且需要在使用session_start()
之前添加$_SESSION
来启用会话。
答案 2 :(得分:-1)
来自@Paul Crovella的建议:
<?php
$password = $_POST['pass'];
$ options [&#39; cost&#39;] = 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 [&#39;传递&#39;]中输入了密码,并且您在$ checkValue [&#39;密码&#39;]中将密码哈希保存在数据库中。
$passLogin = $_POST['pass'];
if(password_verify($passLogin,$checkValue['password'])){
print "Password is correct";
}
else {
print "bad password";
}
这并没有解决SQL注入的严重问题,因此任何值都可以放入POST语句中,初始视图是运行mysql_real_escape_string AS WELL AS string_replace来查找`和&#39;字符并删除它们。
请参阅http://php.net/manual/en/function.password-hash.php
编辑: SQL INJECTION预防 (这是足够的,但如上所述, - &gt; prepare()和 - &gt; execute()处理更好。请研究。
$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);