如何解决:
警告:session_start()[function.session-start]:会话ID太长或包含非法字符,有效字符是az,AZ,0-9和' - ,'在.....在线3
警告:session_start()[function.session-start]:无法发送会话cookie - 已经发送的标头(输出从.....:3开始).....在第3行
警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已经发送的标头(输出从.....:3开始).....在第3行
答案 0 :(得分:41)
这是一个信息漏洞,恶意攻击者可能会更改Cookie并将非法字符分配给PHPSESSID以公开此PHP警告,其实际上包含文件路径和用户名等多汁信息!
答案 1 :(得分:15)
查看此session_start()
discussion进行解决方法:
如果PHPSESSID包含非法字符,则
session_start()
会生成警告警告:session_start()[function.session-start]:会话ID包含非法字符,有效字符为/ home / para / dev / mon_site / header中的az,AZ,0-9和“ - ”。第17行的PHP
为了避免我写这个:
<?php function my_session_start() { if (ini_get('session.use_cookies') && isset($_COOKIE['PHPSESSID'])) { $sessid = $_COOKIE['PHPSESSID']; } elseif (!ini_get('session.use_only_cookies') && isset($_GET['PHPSESSID'])) { $sessid = $_GET['PHPSESSID']; } else { session_start(); return false; } if (!preg_match('/^[a-z0-9]{32}$/', $sessid)) { return false; } session_start(); return true; } ?>
答案 2 :(得分:14)
此问题有一个错误报告(https://bugs.php.net/bug.php?id=68063)
您可以检查session_start是否成功,并在需要时生成ID:
$ok = @session_start();
if(!$ok){
session_regenerate_id(true); // replace the Session ID
session_start();
}
答案 3 :(得分:11)
我编辑了 Andron's previous solution! (修复返回值)并添加my_session_start()的评估输出。以前的解决方案解决了错误消息的问题,但我需要开始会话。
/**
* @return boolean return TRUE if a session was successfully started
*/
function my_session_start()
{
$sn = session_name();
if (isset($_COOKIE[$sn])) {
$sessid = $_COOKIE[$sn];
} else if (isset($_GET[$sn])) {
$sessid = $_GET[$sn];
} else {
return session_start();
}
if (!preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $sessid)) {
return false;
}
return session_start();
}
if ( !my_session_start() ) {
session_id( uniqid() );
session_start();
session_regenerate_id();
}
答案 4 :(得分:5)
我建议使用“更正确”的功能版本。
几点说明:
所以更新后的版本如下:
<?php
function my_session_start()
{
$sn = session_name();
if (isset($_COOKIE[$sn])) {
$sessid = $_COOKIE[$sn];
} else if (isset($_GET[$sn])) {
$sessid = $_GET[$sn];
} else {
session_start();
return false;
}
if (!preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $sessid)) {
return false;
}
session_start();
return true;
}
?>
答案 5 :(得分:2)
如果你不关心其他用户(例如:如果它是私人界面),只需检查浏览器,找到cookie PHPSESSID(或你给它的名字),删除它,然后刷新。
答案 6 :(得分:2)
我提出了这个简单的方法,只是尝试捕捉会话开始,如果有问题重新生成会话。
try {
session_start();
} catch(ErrorExpression $e) {
session_regenerate_id();
session_start();
}