2014-01-08 21 views
-1
<html> 
<head> 
<meta charset="US-ASCII"> 
<title>Login</title> 
</head> 
<body> 
<form method="post" action="checklogin.php" name="login"> 
<table> 
<tr> 
    <td><label for="login">Login</label></td> 
</tr><tr> 
    <td> 
     <label for="email">Email: </label> 
       <input type="text" name="email">  
       <br><label for="password">Password: </label> 
       <input type="password" name="password"><br></td> 
</tr><tr> 
    <td><input type="submit" name="Submit" value="Login"></td> 
</tr> 
</table></form></body> 
</html> 

以上是我的login.php頁面,然後重定向到checklogin.php包含該代碼:PHP登錄頁面沒有進行重定向當輸入正確的信息,

<?php 
require 'dbConn.php'; 
$tableName = "logins"; 
$email = $_POST['email']; 
$password = hash(sha512, $_POST['password'], false); 
$db = pg_query($dbc, "SELECT * FROM $tableName WHERE email='$email' and pass='$password'"); 
$count = pg_num_rows($db); 

if ($count == 1){ 
    $_SESSION['email']=("$email"); 
    $_SESSION['password']=($password); 
    header("location:portal.php"); 
} else { 
    echo "Wrong Email or password"; 
    header("location:index.php"); 
} 

?> 

當我運行這個使用正確的憑證index.php只是似乎刷新它甚至沒有看起來像它重定向到checklogin.php根本。只是爲了清楚所有的文件都在同一個目錄中,所以它不應該與文件放置有關,但如果你無法找到問題,只是試圖告訴我一些事情,我可以檢查你認爲可能使這個代碼不起作用。提前致謝。

+1

你有[在session_start()](http://www.php.net/manual/en/function.session-start.php)地方? –

+1

您是否嘗試過使用第一個字母大寫的位置?位置 – Goikiu

+0

@MarkBaker這也是真的 – Goikiu

回答

0

該腳本包含很多錯誤。

$password = hash(sha512, $_POST['password'], false); 

我想你沒有定義這個常量。所以這裏應該是

$password = hash("sha512", $_POST['password'], false); 

$db = pg_query($dbc, "SELECT * FROM $tableName WHERE email='$email' and pass='$password'"); 

爲先,不寫SQL這樣。至少你必須爲SQL使用佔位符或引用值。

此外,你使用postgresql,所以sql case-sentence。這意味着[email protected]不等於[email protected]


您使用$ _SESSION,但我沒有在任何地方看到session_start。


echo "Wrong Email or password"; 
header("location:index.php"); 

這是錯誤的。你絕不能輸出,影響頭,e.g命令之前的任何數據:,頭,setCookie方法,在session_start等...在PHP文件,不建議


關閉PHP的標籤。


最後,嘗試調試錯誤。設置xDebug/zend調試或只使用echo「debug info」;退出...

祝你好運..

0

你需要的是在每個頁面的開頭應該使用$_SESSION[]變量的session_start()。在你的情況index.phpportal.php

然後,如果您的登錄失敗,您會在header()命令之前得到一個echo,這將導致錯誤。調用必須始終放在任何輸出之前。

<?php 
session_start(); 
require 'dbConn.php'; 
$tableName = "logins"; 
$email = $_POST['email']; 
$password = hash(sha512, $_POST['password'], false); 
$db = pg_query($dbc, "SELECT * FROM $tableName WHERE email='$email' and pass='$password'"); 
$count = pg_num_rows($db); 

if ($count == 1){ 
    $_SESSION['email']=("$email"); 
    $_SESSION['password']=($password); 
    header("Location: portal.php"); 
} else { 
    header("Location: index.php"); 
} 

?> 

你應該看看PDOprepared statements防止SQL注入,這是你的情況可能很容易,因爲你輸入$_POST['email']查詢中不包含逃逸。

0

只是一個註釋/提示:

不要直接在您的查詢字符串中包含電子郵件。這會創建一個SQL注入漏洞! reference 例子: 如果我輸入:'OR 1 = = 1 - 它會創建以下查詢:

SELECT * FROM logins WHERE email='' OR 1=1 --' and pass='$password' 

它將返回TRUE。(注: - 打開評論)

使用mysql_real_escape_string功能在這裏:

$email = mysql_real_escape_string($_POST['email']); 

而且不要忘記第一次檢查,如果它不是空...

相關問題