Важность секретного ключа сеанса в экспресс-веб-фреймворке
Я совершенно сбит с толку важностью секрета сеанса . Я перехожу к веб-разработке с помощью 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 для заполнения ключа. Есть ли с этим проблемы? (с точки зрения безопасности)
3 answers
Я думаю, что в других ответах упущен главный момент, а именно, делает ли параметр secret
управление сеансами более безопасным. это хорошо обсуждается в этой Безопасности.Вопрос StackExchange: Почему небезопасно хранить идентификатор сеанса непосредственно в файле cookie?
Я рекомендую прочитать его (уместен не только ответ с самым высоким голосованием).
Попытка подвести итог: это не значительно снизит вероятность того, что сеанс будет угадан и захвачен в случае, если что идентификаторы сеансов являются большими случайными числами, но это, очевидно, очень поможет, если идентификаторы сеансов будут пользовательскими, как увеличивающиеся идентификаторы, что возможно в ExpressJS.
Пользователи могут использовать любые идентификаторы сеансов, которые они хотят. Возможно, кто-то считает, что им следует использовать автоматически увеличивающееся число из базы данных SQL, это не имеет значения, потому что мы защищаем их неосведомленное решение, подписывая значение, удлиняя ключ.
- Потому что PHP - это не Nodejs. Управление сеансами в PHP отличается от управления сеансами в узле: узел никогда не умирает, в отличие от PHP, который постоянно вызывается вашим демоном сервера (apache, IIS, что у вас есть), просит сгенерировать некоторый контент, а затем завершить его процесс. Узел является эквивалентом Apache плюс PHP.
- Он используется для шифрования файлов cookie сеанса, чтобы вы могли быть разумно (но не на 100%) уверены, что файл cookie не является поддельным, и соединение должно быть обработано в рамках более широкой сессии с express.
- Вот почему вы не вставляете строку в свой исходный код. Вы делаете это переменной среды и считываете ее как process.env ("SESSION_SECRET") или используете файл
.env
с https://npmjs.org/package/habitat , и убедитесь, что эти файлы никогда не касаются вашего хранилища (исключение svn/git/игнорируется), чтобы ваши секретные данные оставались секретными. - секрет остается неизменным во время работы вашего приложения узла. Гораздо лучше просто придумать длинное, забавное предложение, чем 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 гарантирует, что запросы на страницы поступают с вашего собственного сайта, а не завивают запросы или встраиваются в сайты других людей. http://expressjs.com/api.html#csrf для получения дополнительной информации об этом.
Моя путаница была между сеансами на стороне сервера и сеансами на стороне клиента. До сегодняшнего дня я ничего не знал о клиентской стороне. Четкое объяснение этой разницы приведено ниже.
Почему сеанс CherryPy не требует секретного ключа?
Думая о модели на стороне сервера, я был очень смущен тем, где в сеансах потребуется шифрование.