2016-08-31 2 views
1

У меня очень неприятная проблема с очень простым скриптом входа в PHP. Проблема в том, что логин работает даже с неправильным именем пользователя и/или паролем. Я запускаю его в XAMPP 7.0.8 для Linux. Кстати, таблица «пользователи» базы данных «login» имеет только одну строку.Вход в PHP работает с неправильным именем пользователя и паролем

Я пытался понять, как работают эти сценарии, поэтому я попытался с помощью самого элементарного входа в систему. Но для меня это остается загадкой, и теперь я никогда не мог заставить ее работать.

Вот PHP часть:

<?php 

    session_start(); 

    if(isset($_POST['login'])) { 


     $db = mysqli_connect("localhost", "root", "", "login"); 

     $username = strip_tags($_POST['username']); 
     $password = strip_tags($_POST['password']); 

     $username = stripcslashes($username); 
     $password = stripcslashes($password); 

     $username = mysqli_real_escape_string($username); 
     $password = mysqli_real_escape_string($password); 

     $sql = "SELECT * FROM users WHERE username = '$username' LIMIT 1"; 
     $query = mysqli_query($db, $sql); 
     $row = mysqli_fetch_array($query); 
     $id = $row['id']; 
     $db_password = $row['password']; 

     if($password == $db_password){ 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $id; 
      header("Location: index.php"); 
     } else { 
      echo "Error: the information is not correct."; 
     } 


    } 
?> 

А вот HTML форма:

<!DOCTYPE html> 
    <html lang="es"> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Client's area</title> 
    </head> 
    <body> 
      <form method="post" action=""> 
        <input type="text" name="username"> 
        <input type="password" name="password"> 
        <input class="login" type="submit" name="login" value="Login"> 
      </form> 
    </body> 
    </html> 

Edit: идея этого поста никогда не пытался сделать безопасный сценарий входа в систему, его был предназначен для понимания некоторых функций PHP. Я признаю, что небезопасно использовать какую-либо часть этого кода для фактического проекта входа.

+1

пожалуйста, не магазин обычного тексту PASSW ord в вашей базе данных. Используйте хеширование паролей. PHP предоставляет ['password_hash()'] (http://php.net/manual/en/function.password-hash.php) и ['password_verify()'] (http://php.net/manual/ ru/function.password-verify.php), пожалуйста, используйте их. И вот некоторые [хорошие идеи о паролях] (https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) Если вы используете версию PHP до 5.5 [имеется пакет совместимости, доступный здесь] (https : //github.com/ircmaxell/password_compat) – RiggsFolly

+1

Ваш скрипт подвержен риску [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php) Посмотрите, что случилось с [Little Bobby Tables] (http://bobby-tables.com/) Даже [если вы избегаете входных данных, это небезопасно!] (http://stackoverflow.com/ Вопросы/5741187/sql-injection-that-gets-around-mysql-real-escape-string) Используйте [подготовленные параметризованные утверждения] (http://php.net/manual/en/mysqli.quickstart.prepared-statements. php) – RiggsFolly

+2

Это действительно неудачная система входа в систему, вы храните пароли как pl ain, пожалуйста, выйдите и найдите другое учебное пособие, в котором будут использоваться PDO и 'password_hash' http://php.net/manual/en/function.password-hash.php – cmorrissey

ответ

0

Вы можете использовать простой запрос,

$sql = "SELECT * FROM users WHERE username = '$username' and password= '$password'"; 
$query = mysqli_query($db, $sql); 
if(mysqli_num_rows($query) > 0) 
{ 
    //Records matched process further 
    $_SESSION['username'] = $username; 
    $_SESSION['id'] = $id; 
    header("Location: index.php"); 
    exit(); 
} else { 
    //Record not found throw error 
    echo "Error: the information is not correct."; 
} 

Надеется, что это помогает

0

Проблема: вы устанавливаете переменную $row напрямую, даже если она не работает. Это устанавливает пароль $ db_password к '', и пароль должен быть ''. Следовательно, он проходит.

изменить команду $ строка для этого

if ($row = mysqli_fetc_array($query) { 

и добавить } на 3-й линии от нижней (пустой пятно) и добавить «отказа сообщение» там, а

Смежные вопросы