Сессия, проигранная при переключении от HTTP до HTTPS в PHP

Существует множество способов предотвращения SQL-инъекций и других SQL-хаков. Вы можете легко найти его в Интернете (Google Search). Конечно, PDO - одно из хороших решений. Но я хотел бы предложить вам некоторые хорошие ссылки с помощью SQL Injection.

Что такое SQL-инъекция и как предотвратить

Руководство PHP для SQL-инъекция

Microsoft объяснение SQL-инъекции и предотвращения в PHP

и некоторые другие, подобные Предотвращение SQL-инъекций с MySQL и PHP

Теперь, почему вам нужно предотвратить запрос из SQL-инъекции?

Я хотел бы сообщить вам: почему мы пытаемся предотвратить SQL-инъекцию с помощью Ниже приведен короткий пример:

Запрос для проверки подлинности входа:

$query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";

Теперь, если кто-то (хакер) помещает

$_POST['email']= admin@emali.com' OR '1=1

и пароль что-либо ....

Запрос будет анализироваться в системе только до:

$query="select * from users where email='admin@emali.com' OR '1=1';

Другая часть будет отброшена. Итак, что будет? Неавторизованный пользователь (хакер) сможет войти в систему как администратор без своего пароля. Теперь он может делать все, что может сделать администратор / адрес электронной почты. См., Очень опасно, если SQL-инъекция не предотвращается.

62
задан Hamza Zafeer 28 April 2016 в 15:00
поделиться

6 ответов

По умолчанию я ожидал бы, что браузер будет рассматривать соединения с http и https как совершенно другие сессии. Хотя соглашение состоит в том, что http://someUrl/ и https://someUrl / укажет на ту же страницу, это не гарантируется. У Вас могла быть совершенно другая работа сайтов порта 80 (http) и порта 443 (https).

я не знаю PHP, но обычно я не ожидал бы, что переменные сеанса будут в свободном доступе между безопасными и незащищенными сессиями, например, Я не буду ожидать, что номер кредитной карты из моего последнего контроля будет доступен всем последующим небезопасным страницам, которые я посещаю.

Прощают неавторитетный ответ, но я думал, что откажусь от моего 2c, так как нет многих ответов.

0
ответ дан codybartfast 24 November 2019 в 16:48
поделиться

Это не может быть возможно, так как cookie, кажется, теряется. Браузер, который Вы используете, должен думать, что это для совершенно другого домена.

, Какой браузер Вы используете конкретно?

0
ответ дан Allain Lalonde 24 November 2019 в 16:48
поделиться

Похож на Ваши сеансовые куки, создается с безопасным флагом, но существует что-то с URL Вашей страницы контроля, из-за которой сеансовые куки не передаются.

Или вероятно, Ваши сеансовые куки не безопасны - просто, что URL страницы контроля достаточно отличается ( http://mysite.com по сравнению с http://www.mysite.com ), что браузер не отправляет cookie.

, Если требуется читать больше при переворачивании от http до https и наоборот - действительно смотрят на в моей рецензии на выборочном ssl:-)

1
ответ дан 24 November 2019 в 16:48
поделиться

Кажется, что сеансовые куки установлены быть безопасными. Cookie имеют "безопасный" флаг, который, если установлено на истинный, означает, что cookie не будет отправлен в non-https сайты. PHP, вероятно, использует это для своих сеансовых куки. Можно изменить это с функция session_set_cookie_params, или с сессия cookie_secure установка в php.ini.

16
ответ дан fooquency 24 November 2019 в 16:48
поделиться

Когда Вы переключаетесь между HTTP и сервисами HTTPS на тот же сервер, Ваш идентификатор Сеанса HTTP не передается сессии HTTPS. Можно установить его путем передачи идентификатора сессии от страницы HTTP до страницы HTTPS одним из трех возможных способов:

От PHP: session_start:

session_start() создает сессию или возобновляет текущую на основе текущего идентификатора сессии, это передается через запрос, те, которые ДОБИРАЮТСЯ, POST или cookie

При использовании сессий Вы будете обычно запускать свой сценарий с session_start(). Если браузер имеет идентификационный набор cookie сессии, session_start() будет использовать тот идентификатор сессии. Если браузер не имеет идентификационного набора cookie сессии, session_start() создаст новый.

Если идентификатор сессии не установлен (в Вашем примере, браузер создает новый идентификационный cookie сессии для сессии HTTPS), можно установить его с помощью session_id() функция. session_id() также удобно возвращает идентификатор сессии как строку. Так

...

$currentSessionID = session_id();

...

наборы $currentSessionID переменная равняется текущему идентификатору сессии, и

...

session_id($aSessionID);

...

устанавливает sessionID cookie в браузере к $aSessionID. от PHP: session_id

Вот пример с двумя сценариями. К каждому получают доступ через HTTP, и другой получен доступ через HTTPS. Они должны быть на том же сервере для поддержания данных сессии.

Сценарий 1 (HTTP):

<?php

// This script will create a session and display a link to your secure server address
// to transfer your session ID. In this example, the secure page to receive the session
// ID is located at http://www.yoursite.com/safePages/securePage.php

// Start a session using the current session ID stored in a cookie, or create
// a new session if none is set.
session_start();

$currentSessionID = session_id();

// Set a variable that will be retrieved with the HTTPS script.
$_SESSION['testvariable'] = 'It worked';

// $secureServerDomain is the domain of your secure server
$secureServerDomain = 'www.yoursite.com';

// $securePagePath is the path to the page that will receive and set the session ID.
$securePagePath = '/safePages/securePage.php'

echo '<a href="https://' . $secureServerDomain . $securePagePath . '?session="' . $currentSessionID . '">Click here to transfer your session to the secure server</a>';

?>

Сценарий 2 (HTTPS):

<?php

// Retrieve the session ID as passed via the GET method.
$currentSessionID = $_GET['session'];

// Set a cookie for the session ID.
session_id($currentSessionID);

// Start a session.
session_start();

// Test retrieval of variable set when using HTTP.
if (!empty($_SESSION['testvariable'])) {
      echo $_SESSION['testvariable'];
} else {
      echo 'It did not work.';
}

?>

Чтобы это работало, HTTP и серверы HTTPS должны использовать ту же подложку хранения данных сессии (т.е. для обработчика файлов по умолчанию, работать на той же реальной машине с тем же php.ini). Здесь существуют некоторые дефекты безопасности, таким образом, я не использовал бы этот код для передачи уязвимой информации. Это просто предназначено как осуществимый пример.

Когда я столкнулся с этой проблемой прежде, я придумал вышеупомянутое как быстрое исправление, но я просто помнил исходную причину проблемы. Я шел от http://www.example.com/page.php до https://example.com/page.php (заметьте отсутствие "www"). Удостоверьтесь, что http://www.example.com/page.php свяжется с https://www.example.com/page.php, и http://example.com свяжется с https://example.com/page.php.

PS, я на самом деле не запускал эти скрипты, таким образом, может быть опечатка или два, который препятствует тому, чтобы они работали правильно, как.

69
ответ дан Nate 24 November 2019 в 16:48
поделиться

У нас тоже была эта проблема. Оказалось, что это связано с тем, что мы использовали патч suhosin в нашей установке PHP. Мы исправляем это, установив suhosin.session.cryptdocroot = Off в /etc/php.d/suhosin.ini .

Для руководства по suhosin о suhosin.session.cryptdocroot см. http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.cryptdocroot .

Первоначально мы нашли исправление из этого сообщения в блоге: http://www.yireo.com/blog/general-news/315-switch-between-http-and-https-looses-php-session .

12
ответ дан 24 November 2019 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: