0

我有这个 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 地址将包含所有数字

4

5 回答 5

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

于 2013-08-13T14:25:38.593 回答
2

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

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

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

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

  1. 如果我使用手机浏览您的网站并四处走动,从连接到 wifi 网络切换到服务提供商数据包,我的 ip 将更改,您将注销我
  2. 一些(我认为大多数,我可能是错的)ISP不向客户提供固定的IP地址,所以每次重启我的路由器我的IP都会改变,所以我会再次注销
于 2013-08-13T14:42:38.157 回答
1

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

改变

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

$_SESSION['valid']= True;

希望这可以帮助!

于 2013-08-13T14:20:54.967 回答
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

有效字符只有 az、AZ 和 0-9,但 IP 地址将包含句点/点。

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

还;

这个:

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

应该是这样的:

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

试试看,让我知道!

于 2013-08-13T14:27:24.233 回答
0

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

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

经过一些研究和测试,我得出了结果,错误行为的原因是,$_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当会话已经存在时,我们可以通过实现并获取原始 cookie 数据来覆盖给定的预先计算的会话 id来编写我们自己的会话处理程序。

但是,我选择了一个快速的解决方法。默认会话处理程序显然只是评估$_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'].

于 2017-08-13T13:35:31.033 回答