Я пытаюсь создать очень простой вход в PHP, получив зарегистрированное имя пользователя / пароль из базы данных. Это никогда не происходит вживую, и я знаю, что есть нулевая проверка ввода. Все, что я пытаюсь сделать, это выбрать данные из базы данных в логине.
Вот форма входа в index.html:
<table width="250" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> <tr> <form name="form1" method="post" action="checklogin.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> <tr> <td colspan="3"><strong>Member Login </strong></td> </tr> <tr> <td width="78">Username</td> <td width="6">:</td> <td width="294"><input name="Username" type="text" id="Username"></td> </tr> <tr> <td>Password</td> <td>:</td> <td><input name="Password" type="text" id="Password"></td> </tr> <tr> <td> </td> <td> </td> <td><input type="submit" name="Submit" value="Login"></td> </tr> </table> </td> </form> </tr> </table>
И вот PHP checklogin.php:
<?php $sql_connection = mysqli_connect ("localhost:8889","root","root","derek_website_tmp"); if (mysqli_connect_errno()) { echo "failed to connect" . mysqli_connect_error(); } $Username=$_POST['Username']; $Password=$_POST['Password']; $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'" $result=mysqli_query($sql); $count = mysql_num_rows($result); if ($count==1) { $_SESSION['Username'] = $Username; $_SESSION['Password'] = $Password; header('location:login_success.php'); } else { echo 'Wrong Username or Password'; } if (!mysqli_query($sql_connection)) { die('Error : ' . mysqli_error($sql_connection)); } mysqli_close ($sql_connection); ?>
Когда я попробую это, я получаю сообщение об ошибке checklogin.php. Любая помощь будет принята с благодарностью.
Во-первых, обработка ошибок во время разработки очень важна, поэтому мы проверяем, присутствует ли наша почта, мы проверяем, подключены ли мы к базе данных, мы проверяем, прошел ли наш запрос и нормально ли он выполняется, мы проверяем параметры, которые мы предоставляем запрос, и мы, наконец, выполним запрос.
После этого вы можете использовать bind_result
чтобы называть переменную для получения полей из вашего запроса, как я это сделал.
Обратите внимание, как по моему запросу я использую? это подготовленный оператор, который мы определяем с помощью bind_param
чтобы избежать инъекции SQL, в вашем текущем коде SQL Injection все еще возможно, так как вы не дезинфицируете свои переменные.
Еще одна ошибка, которую, я считаю, заключается в том, что вы храните пароли как обычный текст, ОЧЕНЬ ОЧЕНЬ НЕПРАВИЛЬНЫЙ, вы всегда должны шифровать пароль для защиты своих пользователей и себя. Вот почему я не включаю пароль в свой MySQL-запрос, я сначала использую только пользователя, если пользователь найден, я затем использую пароль, который он отправил, чтобы соответствовать полученному паролю из базы данных, в этом случае я использую bcrypt
для выполнения задача, которая является очень надежной библиотекой шифрования.
См. Здесь, как использовать bcrypt
.
Только после того, как я вижу, что пароль действителен, я помещаю данные в сеанс и перенаправляю пользователя.
Помимо всех ошибок, которые я указал в нижней части моего ответа, вот как я напишу ваш код.
<?php session_start(); include_once('bcrypt.php'); // Your database info $db_host = ''; $db_user = ''; $db_pass = ''; $db_name = ''; if (!isset($_POST['Username'])) { echo 'Fill in the username...'; exit; } if (!isset($_POST['Password'])) { echo 'Fill in your password...'; exit; } $con = new mysqli($db_host, $db_user, $db_pass, $db_name); if ($con->connect_error) { die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error); } $sql = "SELECT Username, Password FROM `Members` WHERE Username = ?"; if (!$result = $con->prepare($sql)) { die('Query failed: (' . $con->errno . ') ' . $con->error); } if (!$result->bind_param('s', $_POST['Username'])) { die('Binding parameters failed: (' . $result->errno . ') ' . $result->error); } if (!$result->execute()) { die('Execute failed: (' . $result->errno . ') ' . $result->error); } $result->store_result(); if ($result->num_rows == 0) { die('No username found...'); } $result->bind_result($db_username, $db_password); $result->fetch(); $result->close(); $con->close(); $bcrypt = new Bcrypt(15); if ($bcrypt->verify($password, $db_password)) { $_SESSION['Username'] = $db_username; header('location:login_success.php'); exit; } else { echo 'Wrong Username or Password'; }
ПРИМЕЧАНИЕ. Вышеприведенный код является просто примером и не был протестирован, если вы заметили какие-либо ошибки, связанные с ним, дайте мне знать.
Некоторые из ошибок, которые я заметил в коде, который вы опубликовали:
Вам не хватает закрытия ;
здесь:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
Кроме того, по вашему запросу у вас есть $Members
но у вас нет переменной $Members
определенной где-либо в вашем коде, возможно, вы хотели бы сказать « Members
, как в:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
Разве это не должно
$count = mysql_num_rows($result);
Быть
$count = mysqli_num_rows($result);
А также
$result=mysqli_query($sql);
Быть
$result=mysqli_query($sql_connection, $sql);
У вас нет запроса в mysqli_query
части mysqli_query
if (!mysqli_query($sql_connection))