【问题标题】:Correct way of handling sessions in PHP在 PHP 中处理会话的正确方法
【发布时间】:2015-12-27 06:23:36
【问题描述】:

我正在使用没有任何框架的基于 PHP 5 的 Web 应用程序,我的所有管理页面和用户页面都有以下代码来处理会话。这是处理会话的正确方法吗?或任何防止用户在注销后进入主页的最佳方法?请建议我们。

<?php

if(isset($_SESSION))
{
?>

<html>...</html>

<?php
}
else {
echo 'Session expired';
}
?>

提前致谢。

【问题讨论】:

  • 我认为 isset() 不准确。您可能想改用 isset($_SESSION['var'])。
  • 正如我在回答中建议的那样@Zapp 是对的。
  • 如果您发现它有用,请尝试验证并回答。 :)

标签: php session web-applications


【解决方案1】:

问题是您总是必须以session_start() 开头,因此可能会设置变量$_SESSION

我建议存储一个令牌以实际显示用户是否经过身份验证,以便一旦会话被销毁。

代码片段

    <?php

        session_start();

        if ($_POST["username"] == "admin" && $_POST["password"] == sha1("password")):


            $_SESSION["authorized"] = true;
            $_SESSION["id"] = session_regenerate_id();

        endif;
    ?>

在这种情况下,您可以检查会话是否存在,然后如果用户通过身份验证,最好也重新生成会话 ID。

<?php 
    if(isset($_SESSION) && $_SESSION["authorized"] == true):
        /* What you plan to do here */
    endif;
?>

【讨论】:

  • 可能if(!empty($_SESSION["authorized"])) : 就足够了。因为在你的场景中 $_SESSION["authorized"]bool 所以你真的只需要检查它是否为空。
  • 这是有道理的@Rasclatt,empty() 可以,但我不太喜欢使用它,因为许多开发人员不知道该功能的扩展是空的。跨度>
  • 另外,既然sha1("password") 会像5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 一样$_POST["password"] == sha1("password")?在这种情况下,用户必须输入类似5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 的内容?
  • 因为sha1 是通过$_POST 发送的,而不是实际密码。这只是一个简单的例子来说明原则不是摇摆硬代码问题不是关于安全性而是如何检查会话变量。
【解决方案2】:

在这种情况下,这样做会更短:

<?php
session_start();
if(!isset($_SESSION['whatever']))
    die("Session Expired");
?>
<html>..etc.

您不需要用if/else 包装一大堆脚本。

但是,这个问题是题外话,因为它是基于意见的,而不是专门针对您面临的技术问题。

【讨论】:

    【解决方案3】:

    你在正确的轨道上

    <?php
    
        if(isset($_SESSION))
        {
        ?>
    
        <html>...</html>
    
        <?php
        }
        else {
    
    echo 'Session expired';
    

    我会整理你的台词,让代码更友好

    <?php
        if(isset($_SESSION)) {
    ?>
    
    <html>...</html>
    
    <?php
        } else {
        echo 'Session expired';
    }
    

    您也不需要在 php.ini 文件中指定 &lt;?php; 你可以设置它,这样你就可以在你做出改变后使用&lt;?; 你需要重启 apache (service or /etc/init.d/httpd restat or windows 例如,找到 xampp 并重新启动 apache。

    【讨论】:

    • 您似乎从该代码末尾缺少 2 行:P
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多