복붙노트

[SQL] 내가 MySQL 데이터베이스와 올바르게 상호 작용 연결을 내 로그인 양식을 얻을 수 없다 [마감]

SQL

내가 MySQL 데이터베이스와 올바르게 상호 작용 연결을 내 로그인 양식을 얻을 수 없다 [마감]

내가 일하고자하는 사용자 이름과 암호로 로그인하는 사용자에 대해, 그리고 그 데이터는, 데이타베이스에있는 하나와 일치하는 경우. 나는 오류를 얻을하지 않습니다 시도했지만 작동하지 않는 경우. 나는 Dreamweaver에서 HTML과 PHP를 사용하고, phpMyAdmin에와 WAM하고있다. 나는 형태로 문서와 함께가는 PHP 문서를 모두 포함합니다 :

loginpage.php

 <?php
include('login.php'); // Includes Login Script

if(isset($_SESSION['login_user'])){
header("location: index.php");
}
?>

<table width="15px" border="0">
<form form action='login.php' method='POST'>
<tr>
<td>Username</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
  <td><input type="submit" name="submit" value="submit"/></td>
</tr>
</form>

login.php

  <html>
   <head>
    <title>Login</title>
  </head>
  <body>
  <?php 
    session_start(); // Starting Session
    $error=''; // Variable To Store Error Message
    if (isset($_POST['submit'])) {
    if (empty($_POST['username']) || empty($_POST['password'])) {
    $error = "Username or Password is invalid";
    }
    else
    {
    // Define $username and $password
    $username=$_POST['username'];
    $password=$_POST['password'];
    // Establishing Connection with Server by passing server_name, user_id   and password as a parameter
    $hostname= "localhost";
    $database = "boost";
    $username = "root";
    $password = "";
    $localhost = mysqli_connect($hostname, $username, $password, $database);
    if(mysqli_connect_errno())
    {
        die("Connection Failed".mysqli_error());
    }
    // SQL query to fetch information of registerd users and finds user match.
    $sql = "SELECT * FROM `users`";
    $query = mysqli_query($localhost,$sql);
    if(!$query)
    {
        die("Query Failed".mysqli_error($localhost));
    }
    $rows = mysqli_num_rows($query);
    if ($rows == 1) {
    $_SESSION['login_user']=$username; // Initializing Session
    echo "You are now logged on!";
    } else {
    $error = "Username or Password is invalid";
    }
    mysqli_close($localhost); // Closing Connection
    }
    }
  ?>
 </body>
 </html>

해결법

  1. ==============================

    1.이 답변은 해시, password_hash ()을위한 것이며, password_verify (). mysqli 및 PDO 모두하십시오. 하단의 링크를 추가 링크와 염 등에 대한 몇 가지 언어를 가지고있다.

    이 답변은 해시, password_hash ()을위한 것이며, password_verify (). mysqli 및 PDO 모두하십시오. 하단의 링크를 추가 링크와 염 등에 대한 몇 가지 언어를 가지고있다.

    이 선택과 삽입 직접 사용자가 제공하는 데이터를 사용하지 않는 매우 중요하다. 오히려, 매개 변수 및 호출 바인딩은 SQL 주입 공격을 피하기 위해 문을 준비했다. 암호는 데이터베이스에 맑은 (일반 텍스트)에 저장해서는 안됩니다. 오히려, 그들은 단방향 해시를 통해 전송해야합니다.

    또한 유의하십시오. 이 등록 해싱 및 로그인이 확인 보이고있다. 그것은 전체 업데이트가 당신을 마음 않습니다, 나는 10 달러에 codecanyon에 무릎에 노력하고 ...이 이메일 주소 (로그인) 이미 존재의 재 등록을 표시하도록 기능을 날려되지 않습니다. 이 경우 삽입은 단순히 DB의 장소에 고유 키 세트로 인해 실패합니다. 나는 검색을하고, 말을, 당신에게 독자를 떠날 '이메일 이미 등록을.'

    CREATE TABLE `user_accounts2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `email` varchar(100) NOT NULL,
      `password` varchar(255) NOT NULL,
      PRIMARY KEY (`id`),
      unique key(email) -- that better be the case
    ) ENGINE=InnoDB;
    

    register.php를 통해 실행하고 사용자를 저장 한 후, 데이터는 다음과 같습니다

    select * from user_accounts2;
    +----+-----------+--------------------------------------------------------------+
    | id | email     | password                                                     |
    +----+-----------+--------------------------------------------------------------+
    |  1 | d@d.com   | $2y$10$U6.WR.tiOIYNGDWddfT7kevJU8uiz8KAkdxXpda9e1xuplhC/eTJS |
    +----+-----------+--------------------------------------------------------------+
    
    <?php
        mysqli_report(MYSQLI_REPORT_ALL);
        error_reporting(E_ALL); // report all PHP errors
        ini_set("display_errors", 1); // display them
        session_start();
    
        if(isset($_SESSION['userid'])!="") {
            // you are already logged in as session has been set
            header("Location: safe.php");   // note that this re-direct will at the top of that page
            // ... and there to verify the session state so no tricks can be performed
            // no tricks and gimmicks
        }
    
        if(isset($_POST['register'])) {
            $email = $_POST['email'];
            $ctPassword = $_POST['password'];   // cleartext password from user
            $hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password using cleartext one
    
            // pretend the following is locked in a vault and loaded but hard coded here
            $host="yourhostname";
            $dbname="dbname";
            $user="dbuser";
            $pwd="password";
            $port=3306; // comes along for the ride so I don't need to look up param order below
            // end pretend
    
            try {
                $mysqli= new mysqli($host, $user, $pwd, $dbname,$port);
                if ($mysqli->connect_error) {
                    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
                }
                //echo "I am connected and feel happy.<br/>";
                $query = "INSERT INTO user_accounts2(email,password) VALUES (?,?)";
                $stmt = $mysqli->prepare($query);
    
                // note the 2 s's below, s is for string
                $stmt->bind_param("ss", $email,$hp);    // never ever use non-sanitized user supplied data. Bind it
                $stmt->execute();
                // password is saved as hashed, will be verified on login page with password_verify()
                $iLastInsertId=$mysqli->insert_id;  // do something special with this (or not)
                // redirect to some login page (for now you just sit here)
                $stmt->close(); 
                $mysqli->close();
            } catch (mysqli_sql_exception $e) { 
                throw $e; 
            } 
        }
    ?>
    <html>
    <head>
    <title>Register new user</title>
    </head>
    <body>
    <div id="reg-form">
    <form method="post">
        <table>
            <tr>
            <td><input type="email" name="email" placeholder="Email" required /></td>
            </tr>
            <tr>
            <td><input type="password" name="password" placeholder="Password" required /></td>
            </tr>
            <tr>
            <td><button type="submit" name="register">Register</button></td>
            </tr>
            <tr>
            <td><a href="index.php">Normal Login In Here</a></td>
            </tr>
        </table>
    </form>
    </div>
    </body>
    </html>
    
    <?php
        mysqli_report(MYSQLI_REPORT_ALL);
        error_reporting(E_ALL); // report all PHP errors
        ini_set("display_errors", 1); // display them
        session_start();
    
        if(isset($_SESSION['userid'])!="") {
            // you are already logged in as session has been set
            header("Location: safe.php");   // note that this re-direct will at the top of that page
            // ... and there to verify the session state so no tricks can be performed
            // no tricks and gimmicks
        }
    
        if(isset($_POST['login'])) {
            $email = $_POST['email'];
            $ctPassword = $_POST['password'];   // cleartext password from user
    
            // pretend the following is locked in a vault and loaded but hard coded here
            $host="yourhostname";
            $dbname="dbname";
            $user="dbuser";
            $pwd="password";
            $port=3306; // comes along for the ride so I don't need to look up param order below
            // end pretend
    
            try {
                $mysqli= new mysqli($host, $user, $pwd, $dbname,$port);
                if ($mysqli->connect_error) {
                    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
                }
                //echo "I am connected and feel happy.<br/>";
                $query = "select id,email,password from user_accounts2 where email=?";
                $stmt = $mysqli->prepare($query);
    
                // note the "s" below, s is for string
                $stmt->bind_param("s", $email); // never ever use non-sanitized user supplied data. Bind it
                $stmt->execute();
                $result = $stmt->get_result();
                if ($row = $result->fetch_array(MYSQLI_ASSOC)) {
                    $dbHashedPassword=$row['password'];
                    if (password_verify($ctPassword,$dbHashedPassword)) {
                        echo "right, userid=";
                        $_SESSION['userid']=$row['id'];
                        echo $_SESSION['userid'];
                        // redirect to safe.php (note safeguards verbiage at top of this file about it)
                    }
                    else {
                        echo "wrong";
                        // could be overkill here, but in logout.php
                        // clear the $_SESSION['userid']
                    }
                }
                else {
                    echo 'no such record';
                }
                // remember, there is no iterating through rows, since there is 1 or 0 (email has a unique key)
                // also, hashes are one-way functions in the db. Once you hash and do the insert
                // there is pretty much no coming back to cleartext from the db with it. you just VERIFY it
    
                $stmt->close(); 
                $mysqli->close();
            } catch (mysqli_sql_exception $e) { 
                throw $e; 
            } 
        }
    ?>
    <html>
    <head>
    <title>Login</title>
    </head>
    <body>
    <div id="reg-form">
    <form method="post">
        <table>
            <tr>
            <td><input type="email" name="email" placeholder="Email" required /></td>
            </tr>
            <tr>
            <td><input type="password" name="password" placeholder="Password" required /></td>
            </tr>
            <tr>
            <td><button type="submit" name="login">Login</button></td>
            </tr>
        </table>
    </form>
    </div>
    </body>
    </html>
    

    아마 내일 시간을 가질 때,하지만 지금 난 내이 대답을 가리 킵니다.

  2. from https://stackoverflow.com/questions/33664350/i-cannot-get-my-login-form-to-connect-interact-properly-with-mysql-database by cc-by-sa and MIT license