У меня с трудом переадресовывается на домашнюю страницу, когда кто-то входит в систему. Я успешно заполняю регистрационную форму, и ничего не происходит, я просто остаюсь на той же странице. Я не могу сказать, что любая помощь будет оценена. Благодарю.
<?php include("scripts/connect.php"); $form = "<form action='home.php' method='post'> <table> <tr> <td>Email:</td> <td><input type='text' name='email' class='textbox' size='35'></td> <td><a href='register.php'>Register?</a></td> </tr> <tr> <td>Password:</td> <td><input type='password' name='password' class='textbox' size='35'></td> <td><input type='submit' name='login' value='Login' class='button' alt='Login'></td> </tr> </table> </form>"; if ($_POST['login']){ $email = strip_tags($_POST['email']); $password = strip_tags($_POST['password']); if ($email && $password){ require("scripts/connect.php"); $pass = md5(md5($password)); $query = mysql_query("SELECT * FROM users WHERE email='$email' AND password='$pass'"); $numrows = mysql_num_rows($query); if ($numrows == 1){ $row = mysql_fetch_assoc($query); $dbid = $row['uid']; $dbuser = $row['name']; $_SESSION['name'] = $dbuser; $_SESSION['userid'] = $dbid; header("profile.php?uid=$userid"); } else echo "Your login information was incorrect! $form"; } else echo "You did not fill in the entire form! $form"; } else echo "$form"; ?>
Переменная сеанса в заголовке.
<?php session_start(); $name = $_SESSION['name']; $userid = $_SESSION['userid']; ?>
header("profile.php?uid=$userid");
Вам не хватает самой важной части:
header( "Location: profile.php?uid=$userid" );
Кроме того, как отметил Павел в комментариях ниже, ваш идентификатор пользователя не хранится в $userid
.
$dbid = $row['uid']; ... header( "Location: profile.php?uid=$dbid" );
Наконец, это было бы несправедливо, если бы я не указал на потенциал SQL Injection в вашем запросе. Вы выбираете все строки из таблицы пользователей, чей адрес электронной почты и пароль совпадают. Однако, если я буду передавать в качестве своего адреса электронной почты и угадать случайный пароль, я бы получил доступ:
' or 'a' = 'a
Присоединившись к этому запросу, запрос к базе данных теперь будет выглядеть следующим образом:
SELECT * FROM users WHERE email='' or 'a' = 'a' AND password='$pass'"
На данный момент я могу угадать случайный пароль, и, пока пароль используется кем-то из вашей базы данных, я буду аутентифицирован как первый пользователь в наборе результатов. Если пароли были слишком сложными, но я знал адреса электронной почты некоторых ваших пользователей (не сложно, так как их очень легко найти), я мог бы отменить это:
SELECT * FROM users WHERE email='admin@domain.com' AND password='' OR 'a' = 'a'
Опять же, здесь не имеет значения, что ваш пароль, так как я больше не требую его. Если «a» = «a» (и всегда это делается), тогда пароль больше не требуется. Я был бы зарегистрирован как первый пользователь, у которого был бы указанный адрес электронной почты.
Еще хуже:
SELECT * FROM users WHERE email = '' OR 'a'='a' AND password = '' OR 'a' = 'a'
Это будет регистрировать меня как первого пользователя, который часто бывает у администратора.
Функция header
в PHP позволяет задать заголовок страницы. В вашем случае вы не указываете ничего для заголовка. Вы можете использовать специальный header()
чтобы сообщить браузеру сделать перенаправление на нужный URL.
Это вызовет 302 ответ на браузер и сделает перенаправление. Поэтому ваш код должен выглядеть примерно так:
header("Location: http://example.com");
Перед вызовом этого метода убедитесь, что у вас нет никаких выходов, потому что он не будет работать.
Вы пытались изменить
if ($_POST['login']){
чтобы:
if (isset($_POST['login'])) {
?
И используйте перенаправление заголовка следующим образом:
header("Location: page.php");