PHP session переопределяет любые файлы cookie и CSS с помощью PHPSESSID без вызова session_start()

Я учусь использовать PHP сессии, когда возникла проблема.

Я использовал некоторые пустые страницы для тестирования функций PHP сессий, и я начал сеанс на этих страницах с определенным идентификатором (что-то простое).

В Родительском каталоге, был мой проект для школы, с DID not had the sessions implemented yet. Только некоторые основные PHP для записи / чтения .txt-файл.

Когда я открыл свою страницу проекта, Я заметил, что CSS исчез. Странно, подумал я, ведь я не изменял файлы проекта со вчерашнего дня. Я открыл инспектор в Chrome, и заметил, что в моем <style>атрибуте href не былоstyle.css, а скорееstyle.css; PHPSESSID, что было странно, потому что я не начал сеанс ни на каких страницах, с которыми эта страница была связана.

Он также преодолел мой CSS cookie, который я создал с помощью JavaScript (просто что-то вроде css_page='style.css'). И он также занюхал мой CSS на всех страницах проекта (стили CSS не загружались).

Мой вопрос в том, почему переменная PHPSESSID оказывается в месте, которое не было между <?phpи?>, когда функция session_start() не была вызвана на странице ? И затем, как я могу предотвратить переопределение всех файлов cookie на сайте ?

Edit : as a request from Martin, here is some code :

Страница, где я начал сеанс только для того, чтобы сделать некоторые испытания :

<?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>

fonctions.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();
?>

Я хотел закрыть/уничтожить сеанс полностью, потому что мне нужно по крайней мере два сеанса и «гостевой» режим (без сеанса включен).

1 ответ

  1. Некоторые общие замечания по сеансам PHP:

    • Не устанавливайте значения идентификатора сеанса самостоятельно, но позвольте PHP автоматически генерировать их. Это намного безопаснее и уменьшает вероятность сеанса Hyjacking .

    • Сеансы не должны использоваться в строке URL, вместо того, чтобы передаваться больше под капотом, чем быть obivous (и поэтому легче манипулировать) конечным пользователем.

    • Задайте параметры сеанса в php.ini-файл или С ini_setв верхней части страницы (обычно с include).

    РНР.пример 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 (top):

      ini_set('display_errors', 1);
      ini_set('display_startup_errors', 1);
      error_reporting(E_ALL);
    
    • Если вы хотите разные сеансы для разных пользователей или разные действия на вашем веб-сайте, вам нужно установить разные имена сеансов , а не идентификатор сеанса.

    • Это лучший подход, чтобы иметь сеансы для всех, тех, кто «вошел в систему», и тех, кто не, просто с сохранением флага в данных сеанса, чтобы определить, что есть что, это обойдет много потенциальных проблем согласованности на более развитом веб-сайте.

    образец:

    $_SESSION['loggedin'] = true / false;