我的会话 ID 中的下划线

Posted

技术标签:

【中文标题】我的会话 ID 中的下划线【英文标题】:Underscores in my session id 【发布时间】:2012-03-05 21:07:57 【问题描述】:

我正在尝试跨 AJAX 请求保留会话。简单地调用session_start() 不会获取现有会话,而是创建一个新的会话ID。我的解决方案是通过 AJAX 调用将会话 ID 传递给 php,但这导致了以下错误:

警告:session_start() [function.session-start]:会话id太长或包含非法字符,有效字符为a-z、A-Z、0-9和'-,' in ...

我认为这是因为当前会话 id 包含下划线字符,但该会话 id 是通过调用 session_id() 获取的,那么它怎么可能包含坏字符?

我的意思的简单例子:

页面上的 javascript(使用 jQuery)

var sessID = "<?php echo session_id(); ?>";  //sessID contains underscore characters
$.get('/path/to/script.php',sid:sessID, function(data) 
    //do something
);

脚本.php

<?php
session_id($_GET['sid']);
session_start();
echo $_SESSION['some_key'];
?>

所以我目前正在考虑解析第一页上的会话 ID,并在尝试使用它之前替换其中的任何坏字符,但我不确定这是否是正确的做法或者我是否需要到别处寻找解决方案。

【问题讨论】:

如果 session_start() 没有在 AJAX 调用中保留您的会话,那么您在其他地方遇到了问题。您是否在某处重新生成会话 ID? 有可能。会话实际上是在 Drupal 模块中设置的,但是 JS 和 JS 交互的 PHP 不是 Drupal 站点的一部分。 你真的应该更详细地调查 cookie 问题,而不是打开一个新的通道来传输会话 id。从 firebug 或 fiddler 之类的东西开始检查服务器响应中的 cookie 标头。 @VolkerK - 是的,事实证明 Drupal 做了一些事情来阻止对会话数据的访问。调用 Drupal 引导程序而不是 session_start 可以解决所有问题。 【参考方案1】:
$.get('/path/to/script.php',sid:<?php echo session_id(); ?>, function(data) 
    //do something
);

应该是

$.get('/path/to/script.php',sid:"<?php echo session_id(); ?>", function(data) 
    //do something
);

【讨论】:

【参考方案2】:

所以事实证明,下划线根本不是我的问题的一部分。该问题是由 Drupal 的会话处理引起的,因此需要在 AJAX 调用目标中调用 Drupal 的引导程序而不是 session_start

//use Drupal bootstrap instead of session_start() to access session data set by Drupal
define('DRUPAL_ROOT', $_SERVER['DOCUMENT_ROOT']);
$base_url = 'http://'.$_SERVER['HTTP_HOST'];
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);

解决方案的功劳:http://www.csdesignco.com/content/using-drupal-data-functions-and-session-variables-external-php-script

【讨论】:

重要(至少在 Drupal 7 中):您的脚本必须位于 drupal 根文件夹中,否则这将不起作用!我在 /modules/mystuff/ajax.php 中有我的 ajax.php 并调整了所有路径,但它只会在每个请求上启动一个新会话。将它移到 /ajax.php 并按描述工作。 对我来说不是这样,但很高兴你能成功。

以上是关于我的会话 ID 中的下划线的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jbuilder 而不是下划线的 json 键中的连字符

如何更改 TextInputEditText 中的默认下划线颜色

删除EditText中的其他下划线

mybatis当数据库中的表有下划线的时候怎么办

删除空格或替换为自动生成的 ID 标签的下划线

Python下划线的使用