Ошибка возврата формы входа в HTML - PullRequest
0 голосов
/ 12 мая 2009

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

ПРОБЛЕМА. Когда пользователь входит в систему, после отправки формы страница обновляется, что требует повторного ввода учетных данных. Об ошибке входа не сообщается. До сих пор я мог дублировать эту проблему только в Firefox и Safari. После успешного входа в систему, если выйти из системы и снова войти в нее, кажется, все работает нормально. Это только после того, как вы изначально запустите браузер и попытаетесь войти в первый раз. Я продублировал это на разных компьютерах Mac / Windows.

Вот основная страница входа в систему HTML. Я вырезаю что-нибудь ненужное, но могу предоставить больше кода при необходимости.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

<body>
            <form name="login" method="post" id="mainform" action="clogin.php">
                 <label for="username">Username:</label>
                 <input type="text" id="username" name="username"><br />
                 <label for="password">Password:</label>
                 <input type="password" id="password" name="password"><br />
                 <input type="submit" name="Submit" class="button" style="float:right;" value="Login">                
            </form>
</body>

Вот PHP, также обрезанный для жира:

<?php
$db = mysql_connect('***', '***', '***') or die("Couldn't connect to the database."); 
mysql_select_db('***') or die("Couldn't select the database"); 

$result = mysql_query("SELECT count(id) FROM merchants WHERE passw='$_POST[password]' AND usern='$_POST[username]'") or die("Couldn't query the user-database."); 
$num = mysql_result($result, 0); 

if (!$num) { 

// When the query didn't return anything, 
// display the login form. 

$message = "Login Failed: Incorrect username or password";

header('Location: login.php?message='.$message);


} else { 

// Start the login session 
session_start(); 


// All output text below this line will be displayed 
// to the users that are authenticated. Since no text 
// has been output yet, you could also use redirect 
// the user to the next page using the header() function. 
header('Location: merchants/index.php'); 
} 

У кого-нибудь есть идея, с чего мне начать искать? Моя первая мысль: может быть, форма на самом деле не полностью отправлена? Как я могу сказать, если это произошло? Любые намеки или указатели были бы хорошими. Лично я не могу найти проблему с «кодом», которая может быть причиной этого.

Ответы [ 4 ]

1 голос
/ 12 мая 2009

Сопротивление желанию выкрикнуть «Атака SQL-инъекции !!!! 1111», как вы говорите, скорее похоже, что форма отправлена ​​неправильно.

Пара идей:

Проверяете ли вы каким-либо образом, что форма была отправлена ​​в коде, прежде чем запрашивать базу данных? Если так, это значение определенно публикуется?

У меня была эта проблема в Firefox / Safari раньше, когда у меня был тег <button type="submit"> для отправки формы без значения, назначенного для этой кнопки - IE (<8) был в порядке с этим, но другие браузеры определенно не были т. </p>

Поместите следующий код на страницу отправки, чтобы увидеть, что именно отправляется:

<code>die('<pre>'.print_r($_POST,true).'
');
0 голосов
/ 12 мая 2009

Давайте просто перепишем здесь и посмотрим, как это работает:

<?php
$db = mysql_connect('***', '***', '***') or die("Couldn't connect to the db."); 
mysql_select_db('***') or die("Couldn't select the db"); 

$result = mysql_query("SELECT id FROM merchants WHERE passw='%s' AND usern='%s'",
                      mysql_real_escape_string($_POST['username']),
                      mysql_real_escape_string($_POST['password'])) 
      or die("Couldn't query the user table."); 

if (mysql_num_rows($result) != 0) {
     $user = mysql_fetch_assoc($result);
     $userId = $user['id'];

     // Destroy any old session data from before for a fresh session
     session_destroy();
     session_start(); 

     header('Location: merchants/index.php'); 
     exit();
} else {
    $message = "Login Failed: Incorrect username or password";

    header('Location: login.php?message='.$message);
    exit();
}
?>

Дайте этому шанс. Всегда полезно добавить метод exit () после установки местоположения в заголовке, чтобы убедиться, что код больше не выполняется.

Пока вы это делаете, вы можете захотеть установить сообщение об ошибке в массиве сеансов и отправить его обратно, а не через строку запроса:

...
} else {
    $message = "Login Failed: Incorrect username or password";
    $_SESSION['login_error'] = $message;
    header('Location: login.php');
    exit();
}

Затем просто откройте $ _SESSION ['login_message'] на странице входа в систему, чтобы отобразить любые ошибки.

Если это не поможет вам, попробуйте var_dump () в массиве $ _POST, чтобы увидеть, что входит в вашу форму.

0 голосов
/ 12 мая 2009

Что если вместо выбора COUNT(id) вы просто выбрали * и заменили mysql_result на mysql_num_rows, ошибки все равно будут возникать?

$result = mysql_query("SELECT * FROM merchants WHERE passw='$_POST[password]' AND usern='$_POST[username]'") or die("Couldn't query the user-database."); 
$num = mysql_num_rows($result); 

if ($num < 1) {
0 голосов
/ 12 мая 2009

Получите Данные о вскрытии, добавленные в для Firefox. Это позволит вам просматривать форму сообщения и ответ от сервера. Существуют и другие дополнения, которые будут делать то же самое, или, если вам также нужно просмотреть те же данные в IE, вы можете получить Fiddler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...