2012-04-24 82 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");