最近我尝试为我的项目创建一个登录网页。 所以有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来确定会话是否被记录,并返回undefined。 令我感到困惑的是,即使我试图打印出类似单词的东西,它也会让我“未定义”。 谁能帮我?
答案 0 :(得分:4)
您的代码存在许多问题。无论你把它复制到哪里,都是一个非常糟糕的例子。我有一些业余时间,所以我强调我能看到的,最重要的是:
您可以在数据库中存储纯文本密码。这非常严重,因为如果有人破解您的数据库,可以轻松检索用户名和密码信息。这是一个非常常见的错误,但非常糟糕。而是使用phpass library哈希密码。该网站很好地解释了这是什么。因此,如果您想学习,该网站不仅具有代码,还提供了非常好的通用描述。
代码期望启用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
)
您使用其他过时的语言功能。这只是一个sympton,无论您复制了哪些代码,您都没有采用最先进的代码。你遇到的一些问题:
mysql_*
函数。请改用PDO。它使用起来更简单,功能更强大。它可以通过提供所谓的预准备语句(也称为参数化查询)来主动防止SQL注入。了解它,使用它。session_register
和session_is_registered
个功能。这些用于在会话中注册全局变量。它们不安全并且已被弃用。而是使用$_SESSION
超全局,就像您已经使用$_POST
超全局一样。一长串代码。您没有使用子程序。虽然他们对你很有帮助。了解如何编写your own functions,因为您可以像编写文本一样进行编程。
示例:
<?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的相关答案:
答案 1 :(得分:1)
我想你错过了这一行的引用:if (!session_is_registered(myusername)) {
应该是:if( !session_is_registered("myusername")) {
答案 2 :(得分:0)
您有两个会话(名称相同),这意味着第二个会话将覆盖第一个会话。
当手册说
时,为什么要使用session_register
自PHP 5.3.0开始,此函数已被弃用,自PHP 5.4.0起已被删除。
<强>相反:强>
输入$_SESSION['myusername'] = $usr;
和$_SESSION['mypassword'] = $pswd;
。
删除 main.php 中的第二个session_start()
。
键入if (isset($_SESSION['myusername'])
而不是session_is_registered()
。