重定向到个人资料页面

时间:2012-04-24 13:14:25

标签: php

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

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

3 个答案:

答案 0 :(得分: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注入的可能性,那对您来说是不公平的。您正在从其电子邮件和密码匹配的users表中选择所有行。但是,如果我将以下内容作为我的电子邮件地址传递,并猜测随机密码,我将获得访问权限:

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

这会在第一个用户返回时登录,通常是管理员。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

您是否尝试过更改

if ($_POST['login']){

为:

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

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

header("Location: page.php");