【问题标题】:PHP session_start doesn't workPHP session_start 不起作用
【发布时间】:2017-02-25 08:16:36
【问题描述】:

我的问题是,当我使用 session_start();在我的 php 代码中,没有设置 PHPSESSID cookie,而是设置了一个带有空白标题和值“HttpOnly”的 cookie。使用 var_dump($_SESSION),我看到我可以设置会话变量,它们会显示在页面上,但不会显示在任何其他页面上。值得一提的是,这两个页面位于:login.domain.com/index.php 和 login.domain.com/login。相同的代码在本地运行良好,而在同一服务器上的不同子域上运行的其他 php 文件也可以运行。我找不到任何信息,所以如果有人有任何想法,我很想听听。

这是 index.php 上的 php:

    <?php
        session_start();
    ?>

这是 login/login.php 上的 php

<?php
session_start();
$role = 0; //default to "guest"
$was_success = false; //default to a failed login
if(isset($_POST["user"]) && isset($_POST["password"])){ //if the post details are set then continue
    $pass = password_hash("PASSWORD", PASSWORD_DEFAULT);

    if (!isset($_COOKIE["mellifluous_loginRefer"])){
            $arr = array("Username" => $_POST["user"],
            "Error" => "No destination set!",
            "Success" => false
            );
            die(json_encode($arr));
    }

    if (password_verify($_POST["password"], $pass) && ($_POST["user"] == "USER")){
       $was_success = true;
       if ($_COOKIE['mellifluous_loginRefer'] == "home"){
          $_SESSION['mellifluous']['home']['username'] = $_POST['user'];
       }
    }
    else $was_success = false;
    $arr = array("Username" => $_POST["user"],
                 "Role" => $role,
                 "Success" => $was_success
    );
    if ($was_success) setcookie("mellifluous_loginRefer", "", time() - 10, "/");
    echo(json_encode($arr));
    //echo "You sent in: ";//Username: " . $_POST["user"] . " Password: ";//. $password;
}
else if(isset($_GET["user"]) && isset($_GET["password"])){
    die("This interface has been deprecated.");
    //$pass = password_hash($_POST["password"], PASSWORD_DEFAULT);
    $arr = array("Username" => $_GET["user"]);
    echo(json_encode($arr));
    //echo "You sent in: ";//Username: " . $_POST["user"] . " Password: ";//. $password;
}
else{
    die("ERROR!");
}
?>

提前非常感谢!

【问题讨论】:

  • 检查您是否在&lt;?php 之前的session_start 之前留下了空白
  • 会话在本地工作,但在另一台服务器上不起作用。这不是问题吗?
  • @PrasunJajodia 没有空格。
  • @user3099298 是的,这就是问题所在。
  • 我不认为 php 会话不起作用,请尝试您源代码中的简单测试 php 会话: index.php login.php 如果您的 login.php 页面显示:1 表示 php 会话运行良好,如果运行良好,请检查您当前的源代码

标签: php session cookies


【解决方案1】:

在服务器的 php.ini 文件中检查分配给 session.use_cookiessession.use_only_cookies 的值。

需要在php.ini中设置session.use_cookiessession.use_only_cookies的值:

session.use_cookies=1
session.use_only_cookies=0

【讨论】:

    【解决方案2】:

    我想通了。我的 apache2 conf 文件中有一些奇怪的 cookie 设置,用于该网站,看起来很奇怪/不合适:

         Header set Set-Cookie HttpOnly;Secure
         Header always edit Set-Cookie (.*) "$1; HTTPOnly"
         Header always edit Set-Cookie (.*) "$1; Secure"
    

    删除这些行后,一切正常。

    【讨论】:

      【解决方案3】:

      我无法回答前两个答案,但实际上你不应该那样做。

      session.use_only_cookies 是一种安全功能,它可以防止使用 URL 内的会话标识符进行攻击。有关更多信息,请参阅 php 文档。

       Header set Set-Cookie HttpOnly;Secure
       Header always edit Set-Cookie (.*) "$1; HTTPOnly"
       Header always edit Set-Cookie (.*) "$1; Secure"
      

      关于这部分,HTTPOnly是必需的,它可以防止cookie被XSS攻击窃取。实际上使用Javascript,默认情况下可以显示PHPSESSID值。如果不是 HTTP,则此功能不向源请求提供值。不一定清楚, see OWASP recommandation for more informations.

      关于Secure属性,只有当请求通过安全通道(HTTPS)传输时,用户代理才会在HTTP请求中包含cookie。see OWASP recommandation for this feature

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多