[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.이 답변은 해시, 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>
아마 내일 시간을 가질 때,하지만 지금 난 내이 대답을 가리 킵니다.
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
'SQL' 카테고리의 다른 글
[SQL] 역사적 데이터를 올바르게 EAV 데이터베이스 설계 (0) | 2020.03.30 |
---|---|
[SQL] 어떻게 SQL 서버에서 "날짜"데이터 유형을 사용할 수 있습니까? (0) | 2020.03.30 |
[SQL] SparkSQL 지원 하위 쿼리합니까? (0) | 2020.03.30 |
[SQL] MS 액세스에서 GROUP_CONCAT 기능이있다? (0) | 2020.03.30 |
[SQL] VB에서 SQL 명령에 매개 변수를 "@"를 사용하는 방법 (0) | 2020.03.30 |