2015-10-28 3 views
0

Я пытаюсь создать очень простой скрипт входа с помощью PHP. Я знаю, что система на данный момент очень открыта для SQL-инъекций и небезопасна и все это джаз. Я больше пытаюсь получить базовый уровень, прежде чем я вступлю в систему безопасности.Простой сценарий входа в систему - шифрование входа не работает при входе в систему

У меня есть сценарий, который добавляет пользователя в базу данных. Это работает; однако я застрял в подлинном сценарии входа. Когда я пытаюсь войти в систему, я получаю неверный пароль, даже если знаю, что правильно вводил пароль. Я использую шифрование md5 (опять же, я знаю, что это не безопасно), и я полагаю, что ошибка должна исходить из того, как я читаю свое шифрование в базе данных? Ввод зашифрованного кода в слот пароля из БД возвращает ту же ошибку, поэтому это что-то в моей логике пароля.

add.php - Моя регистрация скрипт

<?php 

//Connects to your Database 
mysql_connect("localhost", "username", "password") or die(mysql_error()); 
mysql_select_db("myDB") or die(mysql_error()); 

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

if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2']) { 
    die('You did not complete all of the required fields'); 
} 

if (!get_magic_quotes_gpc()) { 
    $_POST['username'] = addslashes($_POST['username']); 
} 

$usercheck = $_POST['username']; 
$check = mysql_query("SELECT username FROM users 
         WHERE username = '$usercheck'") 
or die(mysql_error()); 
$check2 = mysql_num_rows($check); 

if ($check2 != 0) { 
    die('Sorry, the username '.$_POST['username'].' is already in use.'); 
} 

if ($_POST['pass'] != $_POST['pass2']) { 
    die('Your passwords did not match. '); 
} 

$_POST['pass'] = md5($_POST['pass']); 

if (!get_magic_quotes_gpc()) { 
    $_POST['pass'] = addslashes($_POST['pass']); 
    $_POST['username'] = addslashes($_POST['username']); 
} 

$insert = "INSERT INTO users (username, password) 
      VALUES ('".$_POST['username']."', '".$_POST['pass']."')"; 
$add_member = mysql_query($insert); 
?> 

<h1>Registered</h1> 

<p>Thank you, you have registered 
    - you may now <a href="login.php">login</a>.</p> 

<?php 
} 

else 
{ 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

<table border="0"> 

<tr><td>Username:</td><td> 

<input type="text" name="username" maxlength="60"> 

</td></tr> 

<tr><td>Password:</td><td> 

<input type="password" name="pass" maxlength="10"> 

</td></tr> 

<tr><td>Confirm Password:</td><td> 

<input type="password" name="pass2" maxlength="10"> 

</td></tr> 

<tr><th colspan=2><input type="submit" name="submit" 
value="Register"></th></tr> </table> 

</form> 

<?php 
} 
?> 

И login.php - Мой сценарий Войти

<?php 

//Connects to your Database 
mysql_connect("localhost", "username", "password") 
    or die(mysql_error()); 
mysql_select_db("myDB") 
    or die(mysql_error()); 

if(isset($_COOKIE['ID_your_site'])){ 
    $username = $_COOKIE['ID_your_site']; 
    $pass = $_COOKIE['Key_your_site']; 
    $check = mysql_query("SELECT * FROM users 
          WHERE username = '$username'") 
          or die(mysql_error()); 

    while($info = mysql_fetch_array($check)){ 
     if ($pass != $info['password']){} 
     else{ 
      header("Location: login.php"); 
     } 
    } 
} 

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

    if(!$_POST['username']){ 
     die('You did not fill in a username.'); 
    } 
    if(!$_POST['pass']){ 
     die('You did not fill in a password.'); 
    } 

    if (!get_magic_quotes_gpc()){ 
     $_POST['email'] = addslashes($_POST['email']); 
    } 

    $check = mysql_query("SELECT * FROM users 
          WHERE username = '".$_POST['username']."'") 
          or die(mysql_error()); 

$check2 = mysql_num_rows($check); 
if ($check2 == 0){ 
    die('That user does not exist in our database. 
     <br /><br />If you think this is wrong <a href="login.php"> 
     try again</a>.'); 
} 

while($info = mysql_fetch_array($check)){ 
    $_POST['pass'] = stripslashes($_POST['pass']); 
    $info['password'] = stripslashes($info['password']); 
    $_POST['pass'] = md5($_POST['pass']); 

    if ($_POST['pass'] != $info['password']){ 
     die('Incorrect password, please <a href="login.php">try again</a>.'); 
    } 

    else{ 
     $_POST['username'] = stripslashes($_POST['username']); 
     $hour = time() + 3600; 
     setcookie(ID_your_site, $_POST['username'], $hour); 
     setcookie(Key_your_site, $_POST['pass'], $hour);  

     header("Location: members.php"); 
    } 
} 
} 
else{ 
// if they are not logged in 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 

<table border="0"> 

<tr><td colspan=2><h1>Login</h1></td></tr> 

<tr><td>Username:</td><td> 

<input type="text" name="username" maxlength="40"> 

</td></tr> 

<tr><td>Password:</td><td> 

<input type="password" name="pass" maxlength="50"> 

</td></tr> 

<tr><td colspan="2" align="right"> 

<input type="submit" name="submit" value="Login"> 

</td></tr> 

</table> 

</form> 

<?php 
} 
?> 

EDIT

Я изменил мой login.php скрипт ниже:

$check = mysql_query("SELECT * FROM users 
         WHERE username = '".$_POST['username']."' 
         AND password = '".$hashedPassword."'") 
         or die(mysql_error()); 

//Gives error if user dosen't exist 
$check2 = mysql_num_rows($check); 
if ($check2 == 0){ 
    die('That user does not exist in our database.<br /><br />If you think this is wrong <a href="login.php">try again</a>.'); 
} 
else{ // if login is ok then we add a cookie 
    $_POST['username'] = stripslashes($_POST['username']); 
    $hour = time() + 3600; 
    setcookie(ID_your_site, $_POST['username'], $hour); 
    setcookie(Key_your_site, $_POST['pass'], $hour);  

    //then redirect them to the members area 
    header("Location: members.php"); 
} 

РЕШЕНИЕ

Фигурные его. Оказывается, у меня был лимит пароля, установленный ниже хеширования, поэтому он не соответствовал бы всему хэшированному паролю в базе данных, тем самым делая логин всегда недействительным.

Тем не менее, я бы назвал ответ Джейсона всем, кто придет сюда искать помощи.

+0

Если вы хотите войти в систему безопасности, вы начинаете называть ее хеш-функцией вместо шифрования (поскольку они принципиально отличаются). – Silencio

+0

Ярмарка. Я не был уверен, что то, что я говорил, было то, что точный ha –

ответ

2

Если у вас есть несколько учетных записей с тем же именем, то вы будете зацикливание через время цикла много раз. В каждом цикле вы устанавливаете переменную post post пароля на сумму md5. Первый цикл через него действительно будет md5 введенного им пароля. Второй и последующий раз он будет принимать сумму md5 предыдущей суммы md5.

Вместо того, чтобы изменять значение супер глобальных данных POST, просто создайте новую переменную. Таким образом, вы всегда можете вернуться к фактическому значению, которое они отправили, до любых манипуляций (например, функции md5).Вам также не нужно создавать сумму md5. Сделайте это один раз и сохраните эту переменную.

$hashedPassword = md5($_POST['pass']); 

while($info = mysql_fetch_array($check)){ 
    $info['password'] = stripslashes($info['password']); 

    if ($hashedPassword != $info['password']){ 
    die('Incorrect password, please <a href="login.php">try again</a>.'); 
} 

Это, как говорится, также не нужно сравнивать значение в PHP. Вы можете просто передать значение MD5 как часть SQL Query напрямую. Если вы не получите никаких строк назад, вы знаете, что у вас нет матча.

$check = mysql_query("SELECT * FROM users 
         WHERE username = '".$_POST['username']."' 
         AND password = '".$hashedPassword."'") 
         or die(mysql_error()); 
+0

Спасибо! Тем не менее, я все еще остаюсь с неправильной ошибкой пароля, когда исправляю проблему с несколькими хешами MD5. Чтобы уточнить, я по существу повторил MD5 над своим вводом несколько раз? И, сохранив исходный ввод в '$ hashedPassword' и запустив его, он должен его решить? –

+0

См. Мое редактирование, чтобы увидеть мою вторую попытку. –

+0

Выяснил это. Ваше решение было не совсем моей проблемой, но было полезно ни к чему. Оказывается, у меня был лимит пароля, установленный ниже хеширования, поэтому он не соответствовал бы всему хэшированному паролю в базе данных, тем самым делая логин всегда недействительным. Еще раз спасибо. –

0
  1. Для шифрования связи это HTTPS, что ваш сайт должен использовать

  2. Кроме того, почему вы используете куки, вы должны использовать сессии вместо

  3. Пароль хранится в виде md5 (или ша) hash, так что это не доступно для людей, которые имеют доступ к базе данных.

  4. Ваш цикл для поиска соответствия может быть проблемой с большим количеством пользователей, используйте оператор select, который matche пользователя и пароль.

  5. Try и искать хороший образец кода, используя ключевые слова (PHP, сессия, логин) one file login

+0

Спасибо вам за ввод. На данный момент я использую только пользовательскую базу данных из 5 пользователей (друзей), и я являюсь единственным аксессуаром базы данных. Я видел вход в один файл; тем не менее, я предпочитаю метод, который у меня есть сейчас, потому что я чувствую, что понимаю его, поскольку он написан для большой его части, и чувствую, что, поняв правильно, я смогу превратиться в более безопасные и сложные сценарии. Спасибо за ваш вклад! –

+0

ok, то, пожалуйста, используйте mysqli или PDO, поскольку mysql_ устарел, используйте SESSIONS вместо cookie и используйте настоящие строки escape-последовательностей на входах запроса mysqli_real_escape_string (...) –

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