Я изучаю PHP, и я создал простой скрипт для входа, но проблема в том, что он перенаправляет меня только на пустую страницу. Он предназначен для перенаправления на index.php, если учетные данные пользователя верны, но это, по-видимому, не так? Существуют также проверки, так что если пользователь вводит пустой, возвращается ошибка. Это, похоже, не было выполнено.
login.php
<form id="login-form" method="post" action="logininc.php"> <fieldset> <legend>Login </legend> <p>Please enter your username and password to access the administrator's panel</p> <label for="user"> <input type="text" name="user" placeholder="Type your username here" id="user" /></label> <label for="password"> <input type="password" name="password" placeholder="Type your password here" id="password" /></label> <label for="submit"> <input type="submit" class="btn btn-primary"name="submit" id="submit" value="Login" /> </label> </fieldset> </form>
logininc.php // моя страница обработки
<?php require_once("assets/configs/db_config.php"); $user=$_POST['user']; $password=$_POST['password']; if(isset($_POST['login'])) { //To ensure that none of the fields are blank when submitting the form if if($user || $password != NULL) { $user = stripslashes($user); $password = stripslashes($password); $user = mysqli_real_escape_string($user); $password = mysqli_real_escape_string($password); $sql="SELECT * FROM $test_db WHERE user='$user' and password='$password'"; $result=mysqli_query($sql); $row=mysql_fetch_array($result); if($row['user'] == $user && $row['password'] == $password) { session_start(); $_SESSION['user'] = $user; $_SESSION['password'] = $password; $_SESSION['loggedin'] = "true"; header("location:index.php"); } else { print ('<div id="error">Computer says no.</div>'); } print ('<div id="error">Enter something!</div>'); } } ?>
в<?php require_once("assets/configs/db_config.php"); $user=$_POST['user']; $password=$_POST['password']; if(isset($_POST['login'])) { //To ensure that none of the fields are blank when submitting the form if if($user || $password != NULL) { $user = stripslashes($user); $password = stripslashes($password); $user = mysqli_real_escape_string($user); $password = mysqli_real_escape_string($password); $sql="SELECT * FROM $test_db WHERE user='$user' and password='$password'"; $result=mysqli_query($sql); $row=mysql_fetch_array($result); if($row['user'] == $user && $row['password'] == $password) { session_start(); $_SESSION['user'] = $user; $_SESSION['password'] = $password; $_SESSION['loggedin'] = "true"; header("location:index.php"); } else { print ('<div id="error">Computer says no.</div>'); } print ('<div id="error">Enter something!</div>'); } } ?>
index.php // страница успеха
<?php //module to check logins session_start(); if(!isset($_SESSION["loggedIn"])){ header("Location: login.php"); exit; } Echo 'Congratulations <b>'.$_SESSION['user'].'</b> you successfully logged in!!<br /> Your Password is: <b>'.$_SESSION['password'].'</b><br /> <a href="login.php">Logout</a>'; ?>
Что произойдет, если вы измените if(isset($_POST['login']))
до if(isset($_POST['submit']))
?
$row = mysql_fetch_array
должно быть $row = mysqli_fetch_array
и, как уже отмечалось, другие используют
if(isset($_POST['user']) && isset($_POST['password'])) { // your code here }
и btw: используя сеанс, где вы только говорите «loggedin = true», или «login = yes» и т. д. – это ничего, кроме безопасного
EDIT (обсуждение безопасности):
пароли всегда должны храниться в зашифрованном виде (регистрация):
function login($email, $password) { $email = mysql_real_escape_string($email); $q = "SELECT id, email, password, salt FROM members WHERE email='" . $email . "'"; $result = mysql_query($q, $this->connection); $output = mysql_fetch_assoc($result); $user_id = $output['id']; $database_username = $output['username']; $database_email = $output['email']; $database_password = $output['password']; $password = hash('sha512', $password); if($database_password == $password) { $user_browser = $_SERVER['HTTP_USER_AGENT']; $user_id = preg_replace("/[^0-9]+/", "", $user_id); $_SESSION['user_id'] = $user_id; $_SESSION['username'] = $email; $login_hash = hash('sha512', $password.$user_browser); $_SESSION['login_hash'] = $login_hash; } else { return false; } } // function function login_check() { $user_id = $_SESSION["user_id"]; $login_hash = $_SESSION["login_hash"]; $email = $_SESSION["username"]; $user_browser = $_SERVER['HTTP_USER_AGENT']; $q = "SELECT password FROM members WHERE id ='" . $user_id . "'"; $result = mysql_query($q, $this->connection); $output = mysql_fetch_assoc($result); $database_password = $output['password']; if(mysql_num_rows($result) == 1) { $login_check = hash('sha512', $database_password.$user_browser); if($login_check == $login_hash) { return true; } else { return false; } } else { return false; } }
Кроме того, вы можете создать случайную соль (регистрацию) для каждого пользователя, чтобы установить уровень безопасности даже немного выше (Примечание: hash (hash (hash (…))) снижает уровень безопасности, поскольку вы теряете информацию во время хэша обработать)
ПРИМЕЧАНИЕ. Это просто (рабочий) пример login / -check-скрипта с высоким уровнем безопасности. Тем не менее этот скрипт можно улучшить (bruteforce, mysqli / подготовленные операторы, хеширование паролей непосредственно в формах, безопасный сеанс, …)
Проблема в if(isset($_POST['login']))
Вы никогда не устанавливали запись «login» в своей форме.
Ты можешь сделать:
if(isset($_POSt["user"]) && isset($_POST["password"])) { $user=$_POST['user']; $password=$_POST['password']; //To ensure that none of the fields are blank when submitting the form if if($user && $password) {
Прежде всего, имя вашей кнопки «Отправить». И вы проверяете, является ли «логин» сообщением или нет.
if(isset($_POST['login'])) {
вif(isset($_POST['login'])) {
это должно было быть:
if(isset($_POST['submit'])) {
Ты написал :
if($user || $password != NULL) {
это должно было быть:
if($user != NULL || $password != NULL) {
Вы использовали команду mysqli и mysql, которая не является хорошей практикой
$result=mysqli_query($sql); $row=mysql_fetch_array($result);
Вместо
if($row['user'] == $user && $row['password'] == $password) { //this code again check for condition which is already checked in the sql statement
лучше писать:
if($row->num_rows==1) {
в index.php вы написали
if(!isset($_SESSION["loggedIn"])){
это должно было быть
if(!isset($_SESSION["loggedin"])){
так как вы сохранили индекс нижнего регистра при сохранении в сеансе.