如何重新生成会话 ID?

Posted

技术标签:

【中文标题】如何重新生成会话 ID?【英文标题】:How To regenerate Session id? 【发布时间】:2015-04-03 15:56:39 【问题描述】:

我正在尝试重新生成会话 ID,但没有成功,我使用了 session_regenerate_id()。但是当我们提交表单时,它会显示:--- “警告:session_regenerate_id():无法重新生成会话 ID - 标头已在第 4 行的 C:\xampp\htdocs\yogesh_traders\yadmin\quo_pro_temp.php 中发送”

请建议如何解决这个问题

<?php
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
echo "Old Session: $old_sessionid<br />";
echo "New Session: $new_sessionid<br />";
exit();
?>
<div align="center">
<img src="images/ajax-loader.gif" />
</div>
<?php
/* if($_REQUEST['clear']=='y' )
$db->Delete('quotation_pro_temp',"session_id='".session_id()."'",1);
//session_regenerate_id();
 */

if(isset($_POST['senditem']))

if(count($_POST['senditem'])>0)


foreach($_POST['senditem'] as $setitem)

$a=$db->SelectSingle("product_details","id='".$setitem."'","");
$data["prod_id"] =$a["id"] ;
$data["pname"] = $a['pname'];
$data["brand"] = $a['brand'];
$data["qty"] = $_POST['qty'."-".$setitem];
$data["measure"] = $a['measure'];
$data["price"] =$_POST['price'."-".$setitem];
$data["mrp_field"] =$a['mrp_field'];
$data["discount"] = $_POST['disc'."-".$setitem]."-".$_POST['distype'."-".$setitem];
$data["total"] = $_POST['equals'."-".$setitem];
$data["session_id"] =$old_sessionid;
$db->Insert('quotation_pro_temp',$data);
echo "<meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=inner_index.php?pagename=quotation_productwise_view&ins=y\">";  


   
?>

【问题讨论】:

使用ob_* 函数来捕获输出而不是直接打印。 headers already sent 确保在调用 session_regenerate_id() 之前没有任何输出 How to fix "Headers already sent" error in PHP 的可能重复项 @Randyka Yudhistria : 请检查上面的代码 为了停止执行,此时使用它我只检查新旧 id 相同或不同,这就是我使用这个 exit() 函数的原因。 【参考方案1】:

您必须在将任何内容发送到客户端之前(在任何输出之前)调用此函数。

确保在此代码之前没有任何输出(例如非 php 代码或echo's)或将函数向上移动。

您还可以使用输出缓冲(请参阅ob_start)将所有输出发送到缓冲区,而不是直接发送到客户端。

也可以默认打开输出缓冲,将 php.ini 中的output-buffering 设置为“打开”并重新启动服务器。另请参阅:How do i edit php.ini file in xampp server

编辑后: 确保&lt;?php 在第一行,并且前面没有空格。你的错误是第 4 行,但代码在第 3 行。

【讨论】:

我这样做了,但它不起作用请检查上面的代码 是的,在 $new_sessionid 时重新生成 id 后,它显示该错误,但为什么我没有得到【参考方案2】:
    您忘记调用 session_start()。 确保在“session_start()”之前没有任何输出,否则会出现“标头已发送错误”。 我在单独的 php 文件中尝试了您的代码,一切正常:
<?php  
session_start();  

$old_sessionid = session_id();  
session_regenerate_id();  
$new_sessionid = session_id();  

echo "Old Session: $old_sessionid";  
echo "New Session: $new_sessionid";  
exit;  
?>

【讨论】:

以上是关于如何重新生成会话 ID?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nodejs Connect 重新生成会话 ID

检查用户代理并在会话类中重新生成会话 ID

重新生成会话 ID

登录后重新生成会话 ID 是一种好习惯吗?

PHP在登录/退出时重新生成会话ID不起作用

NodeJS redis 连接会话 ID 在应该保持不变时重新生成