栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我无法获得登录表单以正确连接与mySQL数据库的交互[关闭]

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我无法获得登录表单以正确连接与mySQL数据库的交互[关闭]

此答案适用于hashing,password_hash()和password_verify()。对于mysqli和pdo。底部的链接具有其他链接以及有关盐等的某些语言。

至关重要的是不要将用户提供的数据直接用于选择和插入。而是绑定参数并调用准备好的语句,以避免sql注入攻击。永远不要将密码以明文形式保存在数据库中。而是应通过单向哈希发送它们。

另请注意。这显示了注册哈希和登录验证。它 不是完整的 功能,我想花10美元在precanyon上用…
…这样它表明电子邮件地址(登录名)的重新注册已经存在,确实更新了,请注意。在这种情况下,由于数据库中设置了唯一键,因此插入将完全失败。我将其留给读者(读者)进行查找,然后说“电子邮件已注册”。

架构图

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 |+----+-----------+--------------------------------------------------------------+

mysqli部分第一

register.php

<?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 pred 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>

login.php

<?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 pred 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>

下面的pdo部分

当我有时间时,大概是明天,但是现在我将您引向我的答案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号