【问题标题】:how to generate unique session ID without the use of session_id()?如何在不使用 session_id() 的情况下生成唯一的会话 ID?
【发布时间】:2013-07-11 14:49:57
【问题描述】:

我想生成一个会话 ID。这个唯一的 sessionId 代表每个不同用户的一些不同数据。

到目前为止我的代码:

  1. 页面的onclick和onload我调用了一个函数create_session_id();

    function create_session_id() {
        // This function sends a string to a PHP page using ajax post.
    }
    
  2. 在我的 PHP 页面上,我收到此数据,然后将其插入:

    session_start();
    $a = session_id();
    $object->insert_sessionid($a);
    

我的问题

是否可以只使用session_start()(没有session_id())并存储一些唯一的会话ID 值,以便稍后在我获取数据并将数据发送到我的网页时使用。我不希望任何点击注册 sessionid。它应该在页面加载时发生,并且没有任何功能create_session_id()

我正在考虑在图片中添加一些 cookie。

注意:我的网站不允许登录。

【问题讨论】:

  • 呃,如果你想引入 cookie,你应该意识到 PHP 会话默认使用 cookie。所以只需使用 session_start(),然后使用session_id() 来获取已创建(或正在重用)的会话 ID。
  • 你可以使用某种计数器吗?
  • session_start() 可以发生在任何 php 页面上,无需与用户进行任何额外的交互,而不仅仅是请求页面。但是 - 不使用“登录”而仅仅使用 cookie 本质上是不安全的,用户清除他们的 cookie 会生成一个新的“唯一”会话,因此您将无法通过此跟踪“用户”,只能重复会话已接受但未清除 cookie 的同一浏览器。
  • @GintasK 他可能可以,但这不会造成潜在的安全威胁,因为会话 ID 很容易被猜到吗?
  • @MarcB:我不需要重用会话 ID。事情是跟踪网站上的用户行为。因此,每个进入网站登录页面的用户都应该被赋予一个会话 ID。显然每个用户行为会有所不同。有人告诉我你可以通过使用 session_start() 来做到这一点。你能给我一个小的 sn-p。问题是我不需要像 create_session_id() 这样的函数并且想在加载时生成会话 ID ??怎么做?

标签: php session cookies session-cookies


【解决方案1】:

使用类似的函数

function createRandomVal($val){
      $chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,-";
      srand((double)microtime()*1000000);
      $i = 0;
      $pass = '' ;
      while ($i<=$val) 
    {
        $num  = rand() % 33;
        $tmp  = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
      }
    return $pass;
    }

并在会话 id 中传递返回值

【讨论】:

  • 感谢您的努力,但正如我所说,我不想创建函数。看看 cmets!!!
  • 不调用任何事件或函数,在加载时你必须调用一些函数或启动一个将为你生成会话值的过程
  • 多么浪费cpu周期。为什么不直接使用 php.net/manual/en/function.openssl-random-pseudo-bytes.php 并获得具有 FAR 更好特性的随机字符串?
  • 这可能吗..如果我在我的 html 主页的第一行写 session_start(),那么接下来我应该怎么做
  • @MarcB:我知道session id是做什么的。我也用过。只是想问你不使用session_id(),我们没有办法生成唯一的session_id吗?
【解决方案2】:

上面的代码有点bug,因为user669677已经编辑了它。

这是正确的代码:

function createRandomVal($val) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,-";
    srand((double)microtime() * 1000000);
    $i = 0;
    $pass = '';
    while ($i < $val) {
        $num = rand() % 64;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

【讨论】:

  • 感谢您修复上述代码中的小错误,但更好的方法是使用:$num = rand() % strlen($chars); 这样最终开发人员可以定义字符。
  • 当心!如果微时间在不同的运行时相同,则生成的字符串将相同。如果唯一性很重要,请不要使用此功能。不要认为这是生成会话 ID 的安全方式
猜你喜欢
  • 2012-06-24
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多