Важность секретного ключа сеанса в экспресс-веб-фреймворке


Я совершенно сбит с толку важностью секрета сеанса . Я перехожу к веб-разработке с помощью 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 конкретных вопроса, касающихся этот.

  1. Почему я не видел этого раньше, когда работал с PHP?
  2. Для чего именно используется секрет сеанса?
  3. Допустим, я меняю ключ сеанса. Мой код с открытым исходным кодом. Не будет ли изменение этого немного излишним в этом случае? Я не вижу возможности запрашивать у пользователя пользовательский ключ в качестве опции.
  4. Я думал о создании случайного UUID для заполнения ключа. Есть ли с этим проблемы? (с точки зрения безопасности)
Author: gluxon, 2013-09-02

3 answers

Я думаю, что в других ответах упущен главный момент, а именно, делает ли параметр secret управление сеансами более безопасным. это хорошо обсуждается в этой Безопасности.Вопрос StackExchange: Почему небезопасно хранить идентификатор сеанса непосредственно в файле cookie?

Я рекомендую прочитать его (уместен не только ответ с самым высоким голосованием).

Попытка подвести итог: это не значительно снизит вероятность того, что сеанс будет угадан и захвачен в случае, если что идентификаторы сеансов являются большими случайными числами, но это, очевидно, очень поможет, если идентификаторы сеансов будут пользовательскими, как увеличивающиеся идентификаторы, что возможно в ExpressJS.

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

 7
Author: argaz, 2017-03-17 13:14:46
  1. Потому что PHP - это не Nodejs. Управление сеансами в PHP отличается от управления сеансами в узле: узел никогда не умирает, в отличие от PHP, который постоянно вызывается вашим демоном сервера (apache, IIS, что у вас есть), просит сгенерировать некоторый контент, а затем завершить его процесс. Узел является эквивалентом Apache плюс PHP.
  2. Он используется для шифрования файлов cookie сеанса, чтобы вы могли быть разумно (но не на 100%) уверены, что файл cookie не является поддельным, и соединение должно быть обработано в рамках более широкой сессии с express.
  3. Вот почему вы не вставляете строку в свой исходный код. Вы делаете это переменной среды и считываете ее как process.env ("SESSION_SECRET") или используете файл .env с https://npmjs.org/package/habitat , и убедитесь, что эти файлы никогда не касаются вашего хранилища (исключение svn/git/игнорируется), чтобы ваши секретные данные оставались секретными.
  4. секрет остается неизменным во время работы вашего приложения узла. Гораздо лучше просто придумать длинное, забавное предложение, чем 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 для получения дополнительной информации об этом.

 36
Author: Mike 'Pomax' Kamermans, 2013-09-02 04:59:18

Моя путаница была между сеансами на стороне сервера и сеансами на стороне клиента. До сегодняшнего дня я ничего не знал о клиентской стороне. Четкое объяснение этой разницы приведено ниже.

Почему сеанс CherryPy не требует секретного ключа?

Думая о модели на стороне сервера, я был очень смущен тем, где в сеансах потребуется шифрование.

 3
Author: gluxon, 2017-05-23 11:46:48