PHP登录页面未重定向输入正确的信息时,

时间:2014-01-08 13:55:37

标签: php html forms

<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
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。只是为了清楚所有的文件都在同一个目录中,所以它不应该与文件放置有关,但如果你找不到问题只是试着告诉我一些我可以检查你认为可能使这段代码不起作用。提前谢谢。

3 个答案:

答案 0 :(得分:0)

您需要的是每个页面开头的session_start()应使用$_SESSION[]变量。在您的情况下index.phpportal.php

然后,如果您的登录失败,则在echo命令之前有一个header(),这将导致错误。 header()调用必须始终放在任何输出之前。

<?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");
}

?>

您应该使用PDO查看prepared statements以防止SQL注入,这在您的情况下很容易实现,因为您在查询中输入了$_POST['email']而没有转义。< / p>

答案 1 :(得分:0)

只是一个提示/提示:

请勿在查询字符串中直接包含该电子邮件。这会创建一个SQL注入漏洞! reference 例: 如果我输入:'或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']);

并且不要忘记先检查它是否为空......

答案 2 :(得分: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。这意味着my@email.com不等于My@email.com。


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


echo "Wrong Email or password";
header("location:index.php");
这是错的。您不得在影响标题的命令之前输出任何数据,例如:header,setcookie,session_start等...


不建议在php文件中关闭php标记。


最后,尝试调试错误。设置xDebug / zend调试或只使用echo“debug info”;并退出...

祝你好运..