如何检查用户名和密码是否与数据库匹配[重复]

This question already has an answer here:

My code checks whether the username exists in the database, however if the password is incorrect or empty the user can still log in (redirected to welcome.php). How can i implement it so that the password has to be correct as well as the username?

<?php 
if($_SERVER['REQUEST_METHOD'] === 'POST'){

    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "logreg";

// Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    $user = $conn->real_escape_string(htmlspecialchars(trim($_POST['username'])));

    $query = "SELECT `username` FROM `users` WHERE `username` = '$user'";

    $result = $conn->query($query);
    if($result->num_rows > 0) {
       header('Location:welcome.php');
       die();
    }
    else $message = 'user does not exist';
}
?>

<html>
    <head>    
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Log In</title>
        <link type="text/css" rel="stylesheet" href="css/bootstrap.css"/>
        <link type="text/css" rel="stylesheet" href="css/bootstrap.min.css"/>
        <link type="text/css" rel="stylesheet" href="css/bootstrap-theme.css"/>
        <link type="text/css" rel="stylesheet" href="css/bootstrap-theme.min.css"/>
        <link type="text/css" rel="stylesheet" href="css/styles.css"/>
        <link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
    </head>
    <body>  
        <div class="header">
             <div class="body">

        <div id="loginbox" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">                    
            <div class="panel">
                    <div class="panel-heading">
                        <div class="panel-title"><h1>Sign In</h1></div>
                            <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="passreset.html">Forgot password?</a></div>
                    </div>    

                    <div style="padding-top:30px" class="panel-body" >
                        <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>

                        <form id="loginform" class="form-horizontal" role="form" action = "index.php" method = "post" enctype="multipart/form-data">
                                 <h4><?php if(isset($message)) : ?>
                    <div class="error"><?php echo $message; ?></div>
                <?php endif; ?></h4>
                            <div style="margin-bottom: 25px" class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                        <input id="username" type="text" class="form-control" name="username" value="" placeholder="username">       </div>

                            <div style="margin-bottom: 25px" class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                                        <input id="login-password" type="password" class="form-control" name="password" placeholder="password">
                                    </div>

                            <div class="input-group">
                                      <div class="checkbox">
                                        <label>
                                          <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me
                                        </label>
                                      </div> 

                             <div style="margin-top:10px" class="form-group">
                                    <!-- Button -->
                                    <div class="col-sm-12 controls">
                                      <input type = "submit" value = "Log In"></a>
                                    </div>
                                </div>
                                    </div>

                                <div class="form-group">
                                    <div class="col-md-12 control">
                                        <div style="border-top: 1px solid#888; padding-top:15px; font-size:85%">
                                            Don't have an account! 
                                        <a href="register.html" onClick="$('#loginbox').hide(); $('#signupbox').show()">
                                            Sign Up Here
                                        </a>
                                        </div>
                                    </div>
                                </div>    
                            </form>     
                        </div>                     
                    </div>  
        </div>
                                <div style="border-top: 1px solid #999; padding-top:20px"  class="form-group">                                    
                                </div>
                            </form>
                         </div>
                    </div>
         </div> 
    </div>
    </body>
    </html>
</div>
dss67853
dss67853 如果您愿意切换到PDO,请使用类似这样的内容来检查登录凭据(或者您可以修改它以使用MySQLi-只需确保使用参数化)。
接近 6 年之前 回复
doumao8803
doumao8803 PHP手册中有一个FAQ条目我建议检查:密码哈希。
接近 6 年之前 回复
duanhuai7532
duanhuai7532 旁注:您不需要htmlspecialchars。您已经在使用real_escape_string,这可能会产生不利影响。
接近 6 年之前 回复

2个回答



检查密码</ p>

  $ query =“SELECTusername ANDpasswordFROMuser WHEREusername ='$ user'和password ='$ password'“; 
</ code> </ pre>

但我建议密码存储为加密 string(阅读下面的评论)。</ p>

所以你这样做</ p>

  $ password = function_that_encrypts($ password); 
$ query = “SELECTusername ANDpassword FROMusers WHEREusername ='$ user'和password ='$ password'”;
</ code> </ pre>

使用< a href =“http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php”rel =“nofollow noreferrer”> 准备好的陈述</ strong> ,或者 PDO准备好的陈述</ strong> 它们更安全 </ em>。</ p>


展开原文

原文

Check password also

$query = "SELECT `username` AND `password` FROM `users` WHERE `username` = '$user' and password = '$password'";

But I recomend the password is stored as an encrypted string (read comments below).

So you do this

$password = function_that_encrypts($password);
$query = "SELECT `username` AND `password` FROM `users` WHERE `username` = '$user' and password = '$password'";

Use prepared statements, or PDO with prepared statements, they're much safer.


  • MD5 is old and considered broken.

I recommend you use CRYPT_BLOWFISH or PHP 5.5's password_hash() function.
For PHP < 5.5 use the password_hash() compatibility pack.

dongyue7796
dongyue7796 MD5是您在行李箱中使用的锁,无论如何都可以用一把剪刀剪开布料。
接近 6 年之前 回复
doujunchi1238
doujunchi1238 我也对你的答案进行了轻微编辑。
接近 6 年之前 回复
doupang9080
doupang9080 非常有意思! 我编辑了我的答案:)
接近 6 年之前 回复
dsgdhtr_43654
dsgdhtr_43654 是的,MD5实际上已被打破。 在商品硬件上每秒可以对数百万个哈希进行暴力检查。 搜索引擎会为您提供相关信息。
接近 6 年之前 回复
duanfoumi5620
duanfoumi5620 只是谷歌“md5密码安全问题”@gbvisconti
接近 6 年之前 回复
dovgqc2648
dovgqc2648 不安全? 有人打破了md5哈希吗? 我在哪里可以读到这个?
接近 6 年之前 回复
dougou5844
dougou5844 “我建议将密码存储为散列md5或sha1。” 您也可以在博客中发布纯文本密码并与所有人共享。 md5和sha1现在不提供任何安全性。 您需要适当的散列,而不是加密。
接近 6 年之前 回复
dongmaopan5738
dongmaopan5738 md5或sha1不再安全..您应该使用SALT来加密密码。 php.net/manual/en/function.crypt.php
接近 6 年之前 回复
douzai1074
douzai1074 尝试过..但不知道我需要做什么:$ user = $ conn-> real_escape_string(htmlspecialchars(trim($ _ POST ['username'])));
接近 6 年之前 回复



您使用的查询仅根据用户名进行选择。 您还需要通过将密码添加到WHERE子句来检查密码。</ p>

根据您所拥有的内容,您需要执行以下操作:</ p>

< pre> $ user = $ conn-&gt; real_escape_string(htmlspecialchars(trim($ _ POST ['username'])));
$ pass = $ conn-&gt; real_escape_string(htmlspecialchars(trim($ _ POST [' password']));
$ query =“SELECTusername ANDpassword FROMusers WHEREusername ='$ user'ANDpassword ='$ pass'”;
</ code > </ pre>

显然,在存储密码之前,您需要对密码执行任何进程。 我希望您没有以纯文本格式存储密码。</ p>
</ div>

展开原文

原文

The query you are using only selects based on the user name. You need to check the password also by adding that to the WHERE clause.

Based on what you have, you'll need to do something like :

$user = $conn->real_escape_string(htmlspecialchars(trim($_POST['username'])));
$pass = $conn->real_escape_string(htmlspecialchars(trim($_POST['password'])));
$query = "SELECT `username` AND `password` FROM `users` WHERE `username` = '$user' AND `password` = '$pass'";

Obviously you'll need to run whatever process on the password that you do before storing them. I am hoping you haven't stored the password in plain text.

drpkcwwav20524605
drpkcwwav20524605 不知道它是否是故意的,但你应该注意SELECT用户名和密码只是一种任意返回0或1(甚至不随机)的奇特方式。 说,改变用户输入的密码不是一个好主意:它没有任何可想象的目的,并迫使你在存储它时进行相同的更改(或者用户将无法再次登录)。
接近 6 年之前 回复
doupu1949
doupu1949 谢谢。 尝试添加错误信息,如果密码不正确,但我总是得到“用户不存在”,如果密码不正确,如何更改?
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐