0

最近我尝试为我的项目创建一个登录网页。所以有 index.html,这个人必须登录的登录页面。它将查询发送到 checklogin.php,它是这样的:

<?php
ob_start();
$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect"); 
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");

// Define $myusername and $mypassword 
$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);
$sql="SELECT * FROM members WHERE username='$myusername' and password='$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){

// Register $myusername, $mypassword and redirect to file "login_success.php"
session_start();
session_register("myusername");
session_register("mypassword"); 
header("location:main.php");
}
else {
    header("location:index.html");
}
ob_end_flush();
?>

然后主页面检查会话,如果您没有登录,它会将您重定向到 index.html,代码如下:

<?php
// Connects to your Database
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect");
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");
//checks cookies to make sure they are logged in
session_start();
session_start();
if(!session_is_registered(myusername)){
header("location:index.html");
}
?>

问题是如果我直接转到 main.html,我不会被重定向回主页。我尝试使用 echo 来确定会话是否被记录,并且它返回未定义。真正让我感到困惑的是,即使我尝试打印出诸如单词之类的其他内容,它也会返回“未定义”。谁能帮我?

4

3 回答 3

4

您的代码有很多问题。无论你把它复制到哪里,这都是一个非常糟糕的例子。我有一些空闲时间,所以我强调一下我能看到的,最严重的首先:

  • 您将纯文本密码存储在数据库中。这是非常严重的,因为万一有人入侵了你的数据库,用户名和密码信息很容易被找回。这是一个非常常见但非常糟糕的错误。而是散列您的密码,例如使用phpass 库。该网站很好地解释了这是关于什么的。因此,如果您想学习,该站点不仅有代码,而且还提供了非常好的通用描述。

  • 代码期望get_magic_quotes_gpc启用。相反,如果启用,它应该拒绝工作。假设启用了魔术引号是一个安全问题,因为它会阻止您编写安全代码

    您的代码:

    $mypassword=$_POST['mypassword'];
    
    // To protect MySQL injection (more detail about MySQL injection)
    $myusername = stripslashes($myusername);
    

    建议:

    if (get_magic_quotes_gpc()) {
        throw new UnexpectedValueException('get_magic_quotes_gpc must be off.');
    }
    $mypassword = $_POST['mypassword'];
    

    (无需再做stripslashes

  • 您使用其他过时的语言功能。这只是一个症状,无论您从哪里复制该代码,您都没有获取最先进的代码。你有几个问题:

    • mysql_*职能。请改用 PDO。它使用起来更简单,功能也更强大。它通过提供所谓的准备好的语句(也称为参数化查询)来帮助您主动防止 SQL 注入。了解它,使用它。
    • session_registersession_is_registered功能。这些用于在会话中注册全局变量。它们不安全且已弃用。而是使用$_SESSION超全局,就像您$_POST已经使用超全局一样。
  • 一长串代码。您不使用子例程。尽管它们可能对您很有帮助。了解如何编写自己的函数,因为您可以像编写文本一样进行编程。

例子:

<?php
require('my-functions.php');

$location = 'index.html';

if ($user = user_form_submitted() && user_is_valid($user)) {
    user_login_into_session_($user);
    $location = 'main.php';       
}

redirect($location);
?>

如您所见,这很容易阅读。然后定义完成这项工作的函数,例如:

/**
 * redirect request
 *
 * @param string $location
 */
function redirect($location) {
    if (!headers_sent()) {
        header("Location: " . $location);
    }
    printf('Moved <a href="%1$s">here</a>.', htmlspecialchars($location));
}

这只是一个例子。因此,您可以开始编程,甚至无需考虑所有荣耀不同的细节将如何工作。

有关使用和提取函数以及使用 PDO 的相关答案:

于 2012-07-21T10:30:03.797 回答
1

我想你错过了这一行的一句话:if (!session_is_registered(myusername)) {

它应该是:if( !session_is_registered("myusername")) {

于 2012-07-21T09:56:25.980 回答
0

您有两个会话(同名),这意味着第二个会话会覆盖第一个会话。

session_register手册上说你为什么要使用

自 PHP 5.3.0 起,该函数已被弃用,自 PHP 5.4.0 起已移除。

反而:

键入$_SESSION['myusername'] = $usr;$_SESSION['mypassword'] = $pswd;

删除main.phpsession_start()中的第二个。

键入if (isset($_SESSION['myusername'])而不是session_is_registered().

于 2012-07-21T10:24:56.493 回答