php会话变量未被设置

时间:2013-08-13 14:18:04

标签: php

我有这个PHP代码,成功登录时应该将我的会话“有效”变量设置为true sniplet:

    if($row['c']>=1)
    {
     session_name($_SERVER['REMOTE_ADDR']);
     session_start();
     $_SESSION['valid']='true';
     echo "Home.php";
    } 
else 
    {echo "/";};
};

然后当下一页加载时,我检查变量是否使用(sniplet:)

进行设置
    session_name($_SERVER['REMOTE_ADDR']);
    session_start();
    if($_SESSION['valid']==true)
     {echo "i am valid";}
    else
     {echo "i am invalid";};

但它一直说该页面无效,即使它确实将其重定向为有效页面

编辑:每个人都注意到这部分代码:$ _SESSION ['valid'] ='true';我道歉,我重新输入了代码,而不是复制它。我的原始代码没有引号。 但它确实有帮助,因为会话ID不能包含数字,而IP地址将包含所有数字

5 个答案:

答案 0 :(得分:3)

所以我在php.net上查看session_name(),我看到了以下警告和评论:

  

警告   会话名称不能仅包含数字,必须至少包含一个字母。否则,每次都会生成一个新的会话ID。

注释: 如果你试图命名一个php会话“example.com”它会转换为“example_com”,一切都会中断。 不要在会话名称中使用句号。

警告:http://www.php.net/manual/en/function.session-name.php

评论来源:http://www.php.net/manual/en/function.session-name.php#86000

答案 1 :(得分:2)

即使我们中的一些人注意到比较不是问题,并且会话名称可能实际上是一个问题,我只是为了添加这个答案。

请注意,这不是问题的解决方案,其他人已经讨论过此问题,包括我在评论中。

我只是想说,即使这是可能的,或者如果你应用转换如删除点并添加一些字母作为前缀我仍然觉得这是一个坏主意。

会话名称用于存储在客户端浏览器中的cookie,用于在后续呼叫中识别他。如果您在会话名称中使用ip,则会在ip地址上锁定会话,并且当这不是一个好主意时,我至少可以考虑两种情况:

  1. 如果我正在使用手机浏览您的网站并四处走动从连接到wifi网络切换到服务提供商数据包,我的IP将会更改,您将登出我
  2. 一些(我认为最多,我可能是错的)ISP没有向客户提供固定的IP地址,所以每次重启到我的路由器我的IP都会改变,所以我会再次登出

答案 2 :(得分:1)

您将$_SESSION变量设置为'True'(字符串),并在if语句中检查它是否为True(布尔值)。它们不一样。

更改

$_SESSION['valid']='true';

$_SESSION['valid']= True;

希望这有帮助!

答案 3 :(得分:1)

session_name($_SERVER['REMOTE_ADDR']);

来自文档:"它应该只包含字母数字字符;" http://php.net/manual/en/function.session-name.php

$_SERVER['REMOTE_ADDR']

来自文档:"用户正在查看当前页面的IP地址。" http://php.net/manual/en/reserved.variables.server.php

有效字符仅为a-z,A-Z和0-9,但IP地址将包含句点/点。

修改的 "有效的变量名称以字母或下划线开头" http://php.net/manual/en/language.variables.basics.php 这也会导致IP地址作为会话名称存在问题。 结束编辑

也;

此:

$_SESSION['valid']='true';

应该是这样的:

$_SESSION['valid']= true; <-- lack of single quotes

试试看,让我知道!

答案 4 :(得分:0)

在某些情况下,您需要在会话名称中实施支持句点的解决方案。例如。我遇到了类似的问题。我必须创建一个PHP页面,模仿ASP页面的确切行为,以保持与客户的外部硬编码前端兼容。在给定的请求标头中,存在cookie名称ASP.NET_SessionId

如果其他人遇到类似的限制,这是一种解决方法。

经过一些研究和测试后,我得出的结果是,错误行为的原因是$_COOKIE在cookie名称中有特殊字符时不包含正确的密钥。

<?php session_start (['name' => 'ASP.NET_SessionId']); ?>
<html>
<head><title></title><meta charset="UTF-8"></head>
<body>
  <pre><?php
    //echo implode("\n", apache_request_headers());
    foreach (apache_request_headers() as $header => $value)
      echo "$header: $value" . PHP_EOL;
    echo "\n";
    var_dump($_COOKIE);
    ?></pre>
</body>
</html>

输出:

Host: example.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: ASP.NET_SessionId=31run6vlfk69j0ni9l02fad82u
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

array(1) {
  ["ASP_NET_SessionId"]=>
  string(26) "31run6vlfk69j0ni9l02fad82u"
}

您在第二个请求中获得了类似的输出。会话ID随每个请求而变化,因为默认会话处理程序无法正确识别会话名称。不幸的是,既没有抛出错误也没有记录任何通知。

我们可以通过实现SessionHandlerInterface来编写我们自己的会话处理程序,并在会话已经存在时获取覆盖给定的预先计算的会话ID的原始cookie数据。

但是,我选择了一个快速的解决方法。默认会话处理程序显然只是评估$_COOKIES变量(或依赖于相同的生成算法)。实际上$_COOKIE变量是一个关联数组,它可以包含任意字符串,包括空格,句点等作为键。我们也可以在运行时覆盖$_COOKIE变量。

<?php
  $raw_cookies = apache_request_headers()['Cookie'];
  $cookies     = preg_split('/;\s*/', $raw_cookies);
  $_COOKIE     = [];

  foreach ($cookies as $cookie)
  {
    list($k, $v) = explode('=', $cookie, 2);
    $_COOKIE[$k] = $v;
  }

  session_start (['name' => 'ASP.NET_SessionId']);
?>
<html>
<head><title></title><meta charset="UTF-8"></head>
<body>
  <pre><?php var_dump($_COOKIE); ?></pre>
</body>
</html>

输出:

array(1) {
  ["ASP.NET_SessionId"]=>
  string(26) "jqf97quci4sh6k0n4p59b3d18n"
}

现在会话ID保持稳定,每次请求后都会恢复$_SESSION中的值。

请注意,apache_request_headers()是支持Apache Web服务器的特定功能。应该有支持备用服务器的功能。

编辑:在我的Apache服务器上,我在$_SERVER[HTTP_COOKIE']中找到了原始的cookie字符串。