Важность секретного ключа сеанса в веб-среде Express Web
Я очень смущен важностью секретности сеанса. Я вскакиваю в веб-разработку с помощью Express и Node, и на данный момент я пытаюсь реализовать простой логин. Нижеприведенный код берется из примера сеансов в Express.
// Required by session() middleware
// pass the secret for signed cookies
// (required by session())
app.use(express.cookieParser('keyboard cat'));
// Populates req.session
app.use(express.session());
Он использует "клавиатурную кошку" как секрет сеанса. Многие из вещей, которые я оглядывал вокруг секретов сессии, рекомендую мне изменить это на что-то обычай. Теперь у меня есть 3 конкретных вопроса.
- Почему я не видел этого раньше, когда работал с PHP?
- В чем секрет секретности сеанса?
- Скажем, я меняю ключ сеанса. Мой код с открытым исходным кодом. Не изменится ли это в этом случае немного избыточно? Я не вижу запроса для пользовательского ключа в качестве опции.
- Я подумывал создать случайный UUID для заполнения ключа. Есть ли проблемы с этим? (с точки зрения безопасности)
Ответы
Ответ 1
Я думаю, что в других ответах основной вопрос отсутствует, а именно: параметр secret
делает управление сеансом более безопасным. он хорошо обсуждается в этом вопросе Security.StackExchange: Почему небезопасно хранить идентификатор сеанса в файле cookie напрямую?
Я рекомендую прочитать его (не только верхний проголосовавший ответ имеет значение).
Попытка подвести итог: это не приведет к существенному уменьшению шансов на угадание и захват сеанса в случае, если идентификаторы сеанса представляют собой большие случайные числа, но это, очевидно, сильно поможет, если идентификаторы сеанса являются обычными, например, приращивание идентификаторов, что возможно в ExpressJS.
Пользователи могут использовать любые идентификаторы сеансов, которые они хотят. Возможно, кому-то кажется, что они должны использовать автоинкрементный номер из базы данных SQL, это не имеет значения, потому что мы защищаем их неосведомленное решение, подписывая значение, удлиняя ключ.
Ответ 2
- Потому что PHP не Nodejs. Управление сеансом в PHP отличается от управления сеансом в node: node никогда не умирает, в отличие от PHP, который постоянно вызывается вашим демоном сервера (apache, IIS, что у вас есть), попросил сгенерировать некоторый контент, а затем завершить его обработать. node является эквивалентом Apache плюс PHP.
- Он использовался для шифрования файла cookie сеанса, поэтому вы можете быть достаточно (но не на 100%) уверенным, что файл cookie не является поддельным, и соединение должно рассматриваться как часть более крупного сеанса с выражением.
- Вот почему вы не помещаете строку в свой исходный код. Вы делаете его переменной окружения и читаете его как process.env( "SESSION_SECRET" ) или используете файл
.env
с https://npmjs.org/package/habitat и убедитесь, что эти файлы никогда не касаются вашего репозитория (svn/ git исключение/игнорирование), чтобы ваши секретные данные оставались секретными.
- секрет является неизменным при запуске приложения node. Гораздо лучше просто придумать длинное смешное предложение, чем UUID, что обычно намного короче
"I didn't think I needed a secret, but the voices in my head told me Express needed one"
.
Как я использую сеансы:
.env(всегда в моем .gitignore файле, чтобы он никогда не попадал в мои публичные репозитории):
SECRET="This is my funky secret oh my god it has ninja turtles"
app.js:
var express = require('express'),
env = (function(){
var Habitat = require("habitat");
Habitat.load();
return new Habitat();
}()),
app = express();
app.use(express.compress()); // gzip all the things. If possible.
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.cookieSession({
key: "mysite.sid",
// seeing this tells you nothing about the actual secret:
secret: env.get("SESSION_SECRET"),
cookie: {
maxAge: 2678400000 // 31 days
}
}));
app.use(express.csrf());
Этот бит CSRF гарантирует, что запросы страниц поступают с вашего собственного сайта, а не cURL-запросы или внедряются на другие сайты пользователей. http://expressjs.com/api.html#csrf для получения дополнительной информации об этом.
Ответ 3
Моя путаница заключалась в сеансах на стороне сервера и на клиентских сессиях. До сегодняшнего дня я не знал о стороне клиента. Ниже приводится четкое объяснение различий.
Почему сеанс CherryPy не требует секретного ключа?
Думая о модели на стороне сервера, я был очень смущен, когда в сеансах потребуется шифрование.