1

当有人登录时,我很难重定向到主页。我成功完成了登录表单,但似乎什么也没发生,我只是停留在同一页面上。我无法发现错误,任何帮助将不胜感激。谢谢。

<?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'];
?>
4

3 回答 3

5
header("profile.php?uid=$userid");

你错过了最重要的部分:

header( "Location: profile.php?uid=$userid" );

此外,正如 Pavel 在下面的评论中指出的那样,您的用户 ID 不存储在$userid.

$dbid = $row['uid'];
...
header( "Location: profile.php?uid=$dbid" );

最后,如果我没有在您的查询中指出 SQL 注入的可能性,这对您是不公平的。您正在从用户表中选择电子邮件和密码匹配的所有行。但是,如果我将以下内容作为我的电子邮件地址传递,并猜测一个随机密码,我将获得访问权限:

' 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'

这将使我以第一个返回的用户身份登录,这通常是管理员。

于 2012-04-24T13:16:04.990 回答
0

PHP 中的header函数允许您设置页眉。在您的情况下,您没有为标题指定任何内容。您可以使用header()特殊情况Location告诉浏览器重定向到所需的 url。

这将向浏览器推送 302 响应并进行重定向。所以你的代码应该是这样的:

header("Location: http://example.com");

在调用此方法之前,请确保您没有任何输出,因为它不起作用。

于 2012-04-24T13:20:58.547 回答
0

你有没有尝试改变

if ($_POST['login']){

至:

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

?

并像这样使用标头重定向:

header("Location: page.php");
于 2012-04-24T13:56:13.390 回答