0

我知道这个主题之前已经在 Stack 上讨论过,我也看过一些答案,但我仍然有点卡住,对 PHP 来说还是个新手。我网站上的每个页面都需要登录,因此用户在页面加载时被重定向到登录页面。在每一页的顶部,我有:

<?
require("log.php");
include_once("config.php"); 
include_once("functions.php"); 
?>

这会将用户重定向到 log.php(添加了新代码):

<?
session_name("MyLogin");
session_start();

    if(isset($_SESSION['url'])) 
       $url = $_SESSION['url']; // holds url for last page visited.
    else 
       $url = "index.php"; // default page for

if($_GET['action'] == "login") {
$conn = mysql_connect("localhost","",""); // your MySQL connection data
$db = mysql_select_db(""); //put your database name in here 
$name = $_POST['user'];
$q_user = mysql_query("SELECT * FROM users WHERE login='$name'");

if (!$q_user) {
    die(mysql_error());
}

if(mysql_num_rows($q_user) == 1) {

$query = mysql_query("SELECT * FROM users WHERE login='$name'");
$data = mysql_fetch_array($query);
if($_POST['pwd'] == $data['password']) { 
$_SESSION["name"] = $name;
header("Location: http://monthlymixup.com/$url"); // success page. put the URL you want 
exit;
} else {
header("Location: login.php?login=failed&cause=".urlencode('Wrong Password'));
exit;
}
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User'));
exit;
}
}

// if the session is not registered
if(session_is_registered("name") == false) {
header("Location: login.php");
}

?>

登录表单包含在 login.php 中。与 PHP/log.php 相关的 login.pho 的代码是:

<?
session_start();

if($_GET['login'] == "failed") {
print $_GET['cause'];
}
?>

<form name="login_form" id="form" method="post" action="log.php?action=login">

我遇到的答案表明我应该添加:

session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];

到我所做的每个页面的顶部(在“require(”log.php“);”上方),然后添加:

if(isset($_SESSION['url'])) 
   $url = $_SESSION['url']; // holds url for last page visited.
else 
   $url = "index.php"; // default page for

到我的登录页面,并在成功登录时使用以下 URL 进行重定向:

header("Location: http://example.com/$url"); // perform correct redirect.

我不是 100% 存储引用 URL 的代码应该放在 log.php 或 login.php 的顶部。

我已经尝试将它添加到两者中,但是一旦我输入了用户名和密码,登录页面就会循环。

我想知道是否有人可以帮助我完成这项工作?

谢谢,

缺口

4

3 回答 3

1

看来我没有权限评论你的帖子,所以我会尽力回答。我为所有的情况道歉,我只是尽我所能一时兴起回答。

场景 1:

如果您确实没有在代码中选择数据库,如此处所示,这可能是您的问题吗?请注意,下面的代码是您发布的代码。

$db = mysql_select_db(""); //put your database name in here 

场景 2:

下面的代码不是我在我构建的任何东西中使用过的东西,我可以建议你尝试用它下面的行替换那行代码吗?

if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement

场景 3:

如果您是以下逻辑,那么 login.php 文件中也存在...这可能是您的问题。访问您的网站后,我注意到您的表单出现在 login.php 上,但您的逻辑正在发布到 log.php。我希望这段代码可以帮助排除“跳转”,因为 login.php 可能会保存自己并覆盖您建立的 $_SESSION 变量

session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];

如果将它从 login.php 文件中取出太复杂,如果你有它,我已经整理了一些代码,你可以用来创建“内部”面包屑,这样你就可以回到你的历史记录中的 2 页.

    if(!isset($_SESSION['internal_breadcrumbs']))
        $_SESSION['internal_breadcrumbs'] = array();

    $_SESSION['internal_breadcrumbs'][] = $_SERVER['REQUEST_URI'];

    $max_breadcrumbs = 5;

    while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
        array_shift($_SESSION['internal_breadcrumbs']);

这将创建一个最多包含 $max_breadcrumbs 元素的数组,最后是您最近的页面,如下所示

Array
(
    [internal_breadcrumbs] => Array
        (
            [0] => /other_page.php
            [1] => /other_page.php
            [2] => /other_page.php
            [3] => /user_page.php <-- desired page
            [4] => /login.php <-- most recent page
        )

)

所以现在...您可以将您的网址设置为更像以下内容...

// I'm doing - 2 to accommodate for zero indexing, to get 1 from the current page
if(isset($_SESSION['internal_breadcrumbs'])) 
    $url = $_SESSION['internal_breadcrumbs'][count($_SESSION['internal_breadcrumbs']) - 2];
else 
   $url = "index.php"; // default page for

一切顺利,我当然希望这在某种程度上有所帮助。

于 2012-04-25T03:12:04.647 回答
0

在场景 4 中

从客户端测试登录/密码,使用 javascript 代码将 XMLHttpRequest ajax 到专用脚本进行验证(在模式 https 上执行以确保安全)

如果响应正确,则将登录密码发送到您的脚本服务器。

提示:编码密码更安全!

于 2013-09-12T15:10:15.030 回答
0

使用 header() 函数是个坏主意。

说明书说;

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。

因此,在您的情况下,我建议使用带有 ID 的 cookie 仅为会话生成,在第一次连接时生成,并且 cookie 的持续时间可能仅为 2 到 10 分钟。

每次调用 logging.PHP 时重新生成 cookie!

祝你今天过得愉快

于 2013-09-12T22:48:34.567 回答