使用PHP会话登录

3
<?php
ob_start();
include("db_connect.php");
$tbl_name='login';
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
 $myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$encrypted_mypassword = crypt($mypassword,'ctk'); 

 $sql="SELECT * FROM $tbl_name WHERE u_name='$myusername' and password='$encrypted_mypassword'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
session_register("myusername");
session_register("encrypted_mypassword");
header("location:edit-grid.php");
}
else {header("location:main_login.php?a=Login Failed Try Again!!");
//echo "Wrong Username or Password";
}
ob_end_flush();
?>

我有一个登录页面如上所示,在本地主机上它可以正常工作,但在 firebug 中显示错误: “Failed to load source for: http://localhost/emp_tracker/main/checklogin.php

在服务器上(即托管时)它无法重定向并失败(会话失败)。


5
哎呀,SQL注入漏洞,简直就像蝙蝠侠一样神圣! - deceze
防止SQL注入攻击,针对从POST传递的代码,如密码等进行处理。 - Haim Evgi
如何防止SQL注入?给我一些提示,我是PHP新手。 - mayuri
阅读我链接的文章。它会让你了解这个问题,并且甚至有一个关于如何预防它的PHP示例。 - deceze
考虑一下如果我传递了一个用户名为admin' or 1='1'会发生什么。 - Paul Dixon
我想知道访问 main_login.php?a=<iframe src="http://myevilsite.com"></iframe> 是否也能起作用? - acqu13sce
2个回答

1

更新的答案

这段代码应该可以工作:

session_start();
include("db_connect.php");

$myusername = mysql_real_escape_string($_POST['myusername']);
$mypassword = crypt($_POST['mypassword'], 'ctk'); 
$mypassword = mysql_real_escape_string($mypassword);

$sql = "SELECT * FROM `login` WHERE `u_name` = '$myusername' and `password` = '$encrypted_mypassword'";
$result = mysql_query($sql);

if(mysql_num_rows($result) == 1)
{
    $_SESSION['myusername'] = $myusername;
    $_SESSION['encrypted_mypassword'] = $encrypted_mypassword;
    header("Location: http://servername/folder/edit-grid.php");
}
else
{
    header("Location: http://servername/folder/main_login.php?a=Login Failed Try Again!!");
}

原始回答

下面的代码行没有意义。您已经在脚本开头开始了会话。此外,{{link1:session_start}} 不需要任何参数。删除它可能会解决您的问题。

session_start('myusername');

此外,在重定向时应使用完整的URL:

HTTP/1.1要求将绝对URI作为“Location:”参数,包括方案、主机名和绝对路径,但某些客户端接受相对URI。通常可以使用$_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF']和dirname()从相对URI中自己创建绝对URI。

来源:http://www.php.net/manual/en/function.header.php

编辑:你的脚本中还有另一个错误。在这一行中:

$_SESSION['myusername']=$result['myusername'];

你使用了$result['myusername'];,但是你应该先获取结果。就像这样:
$row = mysql_fetch_assoc($result);
$_SESSION['myusername'] = $row['u_name'];

我在服务器上替换了你的代码,但它仍然无法工作。它会检查数据库,当我提供错误的ID和密码时,它会显示错误消息,但是对于正确的信息,它不会重定向。在Firebug中它显示“暂时移动”。 - mayuri
如果您直接访问该URL,而不是被重定向到它,它是否有效?您能否展示一下edit-grid.php中检查用户是否已登录的代码? - Mischa
<?php session_start(); if(isset($_SESSION['myusername'])) { ?> <html>.... </html><?php }?> 编辑网格文件,检查登录会话 - mayuri
这段代码在本地主机上可以运行,对吧?很抱歉,我不知道还能为您做些什么。也许您应该联系您的主机提供商并询问发生了什么事情。 - Mischa
是的,在本地主机上它可以工作,但在服务器上它显示为无法加载? - mayuri
显示剩余9条评论

0

我也遇到了同样的问题,但是无法找出实际原因。以下几点可能会有所帮助: 1)在头部之前不应该有任何输出,即没有echo或html。 2)还要检查每个php语句末尾是否有适当的分号。 3)在谷歌上搜索后,似乎这个问题只会在旧版本的firebug中出现。(不确定) 4)尝试逐行运行代码。即通过echo查看用户名和密码是否正确发布。同时,数据库连接是否正确以及查询结果是否符合预期。

你的服务器上是否出现500内部服务器错误?


现在你已经删除了 session_start,而且 session_register 已经不推荐使用。你应该像以前一样使用 $_SESSION。参考:http://www.php.net/manual/zh/function.session-register.php - Mischa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接