提问人:Thibault de Villèle 提问时间:5/1/2016 最后编辑:Thibault de Villèle 更新时间:5/1/2016 访问量:1542
PHP 会话使用 PHPSESSID 覆盖任何 cookie 和 CSS,而不调用 session_start()
PHP session overrides any cookie and CSS with PHPSESSID, without session_start() called
问:
当出现问题时,我正在学习使用PHP会话。
我正在使用一些空白页来测试PHP会话的功能,并且我已经在这些页面上启动了一个具有特定id(简单的东西)的会话。
在父目录中,有我的学校项目,但 DID 尚未实施课程。只有一些基本的PHP来写入/读取.txt文件。
当我打开我的项目页面时,我注意到CSS不见了。很奇怪,我想,因为我从前一天开始就没有修改过项目的文件。我在 Chrome 中打开了检查器,并注意到在我的 href 属性中没有 but 而是很奇怪,因为我没有在此页面链接到的任何页面上启动任何会话。<style>
style.css
style.css; PHPSESSID
它还覆盖了我用 JavaScript 创建的 CSS cookie(就像 )。它还让我在项目的所有页面上都感到厌烦(CSS 样式没有加载)。css_page='style.css'
我的问题是,当页面中未调用 session_start() 函数时,为什么 PHPSESSID 变量最终会出现在不在 和 之间的地方?然后,我怎样才能防止它覆盖网站上的所有 cookie?<?php
?>
编辑:作为 Martin 的要求,这里有一些代码:
我开始会话只是为了做一些测试的页面:
<?php
session_id("you");
session_start();
?>
<html>
<head>
<title>Test</title>
</head>
<body>
<?php
echo "Bonjour<br/>";
$_SESSION["pre"] = "firstName";
$_SESSION["nom"] = "lastName";
$_SESSION["idd"] = "identifiernumber";
echo $_SESSION["pre"]."<br/>";
echo $_SESSION["nom"]."<br/>";
echo $_SESSION["idd"]."<br/>";
print_r($_SESSION);
?>
</body>
</html>
我注意到无聊的CSS的页面:
<html>
<head>
<meta charset="utf-8">
<link id="css" rel="stylesheet" type="text/css" href="style.css">
<script src="fonctions.js"></script>
</head>
<body onload="createcookie()">
<!-- Some text in divs, nothing in php -->
</body>
</html>
文件:.js:
function changeCSS(){
var sheet = document.getElementById('css').getAttribute('href');
if (sheet == "style.css") {document.getElementById('css').setAttribute('href', 'style2.css');}
else {document.getElementById('css').setAttribute('href', 'style.css');}
}
function chooseCSS(style) {
document.getElementById('css').setAttribute('href', style);
}
function checkCookie(coo) {
var cuki = document.cookie;
var ind = cuki.indexOf(coo);
if (ind != -1) {return true;}
else {return false;}
}
function createcookie() {
if (!checkCookie('css')) {
foo = document.getElementById('css').getAttribute('href');
if (foo == "") {foo = "style.css"};
document.cookie = "css=" + foo;
}
var x = document.cookie.split("=");
chooseCSS(x[1]);
}
注意:在另一个测试php页面中,我使用了以下函数(按此顺序):
<?php
session_start();
$_SESSION = array();
session_destroy();
?>
我想完全关闭/销毁会话,因为我至少需要两个会话和一个“访客”模式(未打开会话)。
答:
关于PHP会话的一些一般说明:
不要自己设置会话 ID 值,而是允许 PHP 自动生成它们。这更加安全,并减少了会话劫持的机会。
会话不应该在 URL 行中使用,而应该在后台传输,而不是让最终用户变得笨拙(因此更容易纵)。
在 php.ini 文件中设置会话参数,或在页面顶部设置会话参数(通常带有包含)。
ini_set
php.ini 示例:
session.savepath=/home/directory/custom_session_folder
session.name=a_custom_session_name
session.cookie_httponly=1 /* So not passed in URL */
session.cookie_secure=0 /* set to 1 for HTTPS cookies */
session.entropy_file=/dev/urandom /* better more secure session id generation */
session.hash_function=whirlpool /* same, better way of generating session hashes */
session.use_trans_sid=0 /* turn off transferable id's */
- 使用页面顶部的以下行为 PHP 脚本启用错误报告:
PHP页面示例(顶部):
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
如果您希望在网站上为不同的用户或不同的活动设置不同的会话,则需要设置不同的会话名称,而不是会话 ID。
为每个人(“登录”和未登录)提供会话是一种更好的方法,只需在会话数据中保存一个标志来定义哪个是哪个,这将避免在更发达的网站上出现许多潜在的一致性问题。
例:
$_SESSION['loggedin'] = true / false;
评论
<link>
评论
style
PHPSESSID