2012-04-24 101 views
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']; 
?> 

回答

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

你错过了最重要的部分:

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

此外,如帕维尔在下面的评论中指出,您的用户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='[email protected]' AND password='' OR 'a' = 'a' 

同样,在这里,这不是”不管你的密码是什么,因为我不再需要它。如果'a'='a'(并且始终如此),则不再需要密码。我将以第一个用户的身份登录,以提供电子邮件地址。

更糟糕的是:

SELECT * FROM users WHERE email = '' OR 'a'='a' AND password = '' OR 'a' = 'a' 

这将记录在我的第一个用户返回,这往往是次管理员。

+1

,当我阅读代码,变量名实际上是$ DBID – 2012-04-24 13:17:00

+0

我做了这个变化在它仍然在同一页上。生病后张贴有会话变量的头文件。 – ManWithNoName 2012-04-24 13:33:20

+0

'header('Location:...')'是否重定向用户。或者当你说你留在同一页面时,你的意思是你没有通过认证,因此被发回到登录页面? – Sampson 2012-04-24 13:40:32

0

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

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

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

确保你不调用此方法之前有任何输出,因为它不会工作。

0

你有没有尝试改变

if ($_POST['login']){ 

到:

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

,并使用标头重定向这样的:

header("Location: page.php");