Безопасно ли хранить пароли в файлах cookie?

На домашней странице моего веб-приложения есть флажок RememberMe. Если пользователь проверит это, я сохраню адрес электронной почты и пароль в файлах cookie. Это мой код:

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true)
   {
     HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text);
     cookie.Expires.AddYears(1);
     Response.Cookies.Add(cookie);
   }

Я хочу знать следующее:

  • Безопасно ли хранить пароли в файлах cookie?
  • Как правильно сделать то же самое?
  • Каковы наилучшие методы установки времени для файла cookie?

person ACP    schedule 20.01.2010    source источник
comment
Пусть FormsAuthentication справляется с этим! FormsAuthentication.SetAuthCookie(имя пользователя, правда);   -  person this. __curious_geek    schedule 20.01.2010


Ответы (10)


НЕбезопасно хранить пароли в файлах cookie, поскольку они доступны в виде обычного текста.

Хорошим местом, где можно найти ответы о файлах cookie, является Cookie Central. Для членства обычно используется файл cookie с длинная строка под названием «токен», которая выдается с веб-сайта, когда вы указываете свое имя пользователя и пароль. Подробнее об этом процессе вы можете узнать в этой статье. При использовании проверки подлинности с помощью форм в ASP.NET вы можете установить файл cookie проверки подлинности следующим образом:

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);

Второй параметр используется для функции «Запомнить меня» — если установлено значение «истина», будут созданы постоянные файлы cookie, которые будут сохраняться после того, как вы покинете сайт. Вы также можете программно манипулировать файлом cookie следующим образом:

HttpCookie authCookie =
  HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
person Branislav Abadjimarinov    schedule 20.01.2010
comment
Верно. Никогда не безопасно хранить пароли где бы то ни было. Сохраняйте только хешированную версию и проверяйте ее. - person Matt Ellen; 21.09.2010
comment
Здесь вам даже не нужна хешированная версия (и избегайте ее, потому что это имеет свои риски, например, отсутствие соли). Достаточно произвольного токена, который не имеет математического отношения к идентификатору пользователя — единственная сторона, которая понимает токен, — это ваша служба входа в систему, и она проверяет токен с помощью поиска в БД. - person MSalters; 21.09.2010
comment
К вашему сведению, ссылка на эту статью (jaspan.com/improved_persistent_login_cookie_best_practice) теперь 403 запрещена. Вот одна из форм The Wayback Machine (например, последний снимок 2015 года): web.archive.org/web/20151115230100/http://jaspan.com/ - person Sz.; 24.04.2020

Нет! Не храните пароли в файлах cookie!

В ASP.NET используйте

FormsAuthentication.SetAuthCookie(username, true);

Значение второго аргумента определяет, является ли файл cookie постоянным (значение флажка «Запомнить меня»).

person stepanian    schedule 20.01.2010

Нет, не удаленно безопасно. У вас нет гарантии, что файлы cookie не хранятся в виде обычного текста (и на самом деле большинство реализаций делают хранят их в виде обычного текста).

Имейте в виду, что «запомнить меня» по своей сути небезопасно, поскольку любой, кто перехватывает файл cookie, получает доступ к приложению. Но раскрытие пароля пользователя делает его еще одним шагом вниз по лестнице незащищенности. :-) И, вероятно, действительно разозлит пользователя, если он узнает.

Я использую зашифрованную строку cookie, которая включает имя учетной записи пользователя в сочетании с токеном, который никак (иным образом) не связан с учетной записью пользователя, кроме как в таблице на моем сервере. Когда пользователь возвращается на сайт, мы расшифровываем файл cookie и проверяем, действительно ли этот токен связан с этой учетной записью. Токен (и, следовательно, файл cookie) изменяет каждый автоматический вход в систему и делает недействительным тот, который использовался для этого автоматического входа. (Между токенами и учетной записью существует отношение «многие к одному», позволяющее автоматически входить в систему из нескольких мест. Вы можете ограничить это, если хотите.) Срок действия токенов истекает, если они не используются в течение X дней. (Это делается не только путем ограничения продолжительности файла cookie, но и на стороне сервера.) Есть еще несколько вещей, которые я добавляю туда, чтобы немного усложнить жизнь тому, кто пытается расшифровать файл cookie (успешно расшифровав его) или использовать украденный файл cookie (который не требует расшифровки), но нет смысла перебарщивать (опять же, «запомнить меня» по своей сути небезопасно).

Я использую это на сайте, где надежная защита на самом деле не нужна (очевидно) и у которого есть большое количество клиентов с динамическим IP, поэтому я не пытаюсь заблокировать его по IP. Но даже привязка к IP-адресу не делает его безопасным, а просто немного уменьшает поверхность атаки.

Вам может быть интересно, почему у меня есть имя пользователя в файле cookie. Для прямых целей «запомнить меня» я бы не рекомендовал иметь его там, даже если он зашифрован (в конце концов, это половина пары аутентификации в системе имя пользователя + пароль). Я был немного удивлен, обнаружив это в нашем файле cookie, когда я посмотрел на формат, когда напомнил себе, как мы сделали это для этого вопроса; но затем я увидел комментарии, объясняющие, почему это там, и есть причины, не связанные с «помнить меня» (не обязательно убедительные причины, оглядываясь назад, но причины).

И последнее замечание: тот факт, что функция «запомнить меня» по своей сути небезопасна, является одной из многих причин, по которой журналы сайта очень важны, и почему вы должны требовать повторной проверки пароля в процессе изменения важной информации учетной записи (чтобы затруднить кто-то украл файл cookie, чтобы стать владельцем учетной записи).

person T.J. Crowder    schedule 20.01.2010
comment
Токен, который меняется при каждом входе в систему, запрещает автоматический вход в одну и ту же учетную запись из разных мест (дома и работы) или из разных браузеров. - person Hans Kesting; 20.01.2010
comment
@Hans: Только если вы разрешаете использовать только один токен для каждой учетной записи. Если вы разрешаете отношение «многие к одному» между токенами и учетными записями пользователей (я делаю это через таблицу токенов), пользователь может иметь несколько активных автоматических входов в систему. Я обновлю ответ, чтобы сделать его более ясным и упомянуть тайм-ауты. - person T.J. Crowder; 20.01.2010

Это то, чего вы никогда не должны делать, потому что очень легко изменить значение файла cookie и отправить его обратно на сервер. Даже сохранение «пользователь вошел в систему как« наивист »» в файле cookie неправильно, потому что я мог бы изменить его на «пользователь вошел в систему как« Пандия Чендур »».

Что вы можете сделать в файлах cookie, так это предоставить клиентам информацию, которая, даже если она изменена, не имеет смысла для сервера. Например, любимый цвет, макет первой страницы и так далее.

Вы можете дать им идентификатор сеанса, который хранится в файле cookie, потому что они не смогут сделать ничего лучше для себя, если изменят значение на что-то другое (если только они не знают действительный идентификатор сеанса из другого сеанса).

Что Microsoft MSDN говорит об использовании файлов cookie:

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

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

Точно так же с подозрением относитесь к информации, которую вы получаете из файлов cookie. Не думайте, что данные такие же, как когда вы их записали; используйте те же меры безопасности при работе со значениями файлов cookie, что и с данными, которые пользователь вводит на веб-странице. В примерах, приведенных ранее в этом разделе, показано HTML-кодирование содержимого файла cookie перед отображением значения на странице, как и перед отображением любой информации, которую вы получаете от пользователей.

Файлы cookie передаются между браузером и сервером в виде обычного текста, и любой, кто может перехватить ваш веб-трафик, может прочитать файл cookie. Вы можете установить свойство файла cookie, которое заставит файл cookie передаваться только в том случае, если соединение использует протокол защищенных сокетов (SSL). SSL не защищает файл cookie от чтения или манипулирования им, пока он находится на компьютере пользователя, но предотвращает чтение файла cookie во время передачи, поскольку файл cookie зашифрован. Дополнительные сведения см. в разделе Основные меры безопасности для веб-приложений.

person naivists    schedule 20.01.2010

  • Если вы используете SSL, что вы должны делать, если вы передаете какую-либо защищенную информацию, это исключает прослушивание вашего веб-трафика третьей стороной. Это будет та же проблема, независимо от сохранения учетных данных пользователей в файле cookie, потому что, когда они входят в систему, вы все равно отправляете свое имя пользователя и пароль на сервер, где я предполагаю, что сервер хэширует его и сравнивает с хешированным паролем, который у вас есть для этого пользователя.

  • Другие домены никогда не смогут прочитать ваш файл cookie из-за перекрестного происхождения, так что это не проблема.

  • Так что на самом деле единственная «дыра в безопасности», если хотите, это если кто-то физически получит доступ к своему компьютеру. Если это произойдет, они, скорее всего, все равно получат от этого человека любую информацию, которую захотят. Как вы объясните, когда Chrome автоматически заполняет формы входа для вас, это безопасно? Я уверен, что они не хранят его в виде простого текста, но это даже не имеет значения. Если вы перейдете на страницу, которую хром автоматически заполняет, вы можете просто скопировать пароль из формы и посмотреть, что теперь у вас есть пароль этого человека.

  • Это действительно сводится к тому, насколько «безопасным» вам это нужно. Я согласен с тем, что шифрование информации о пользователях с истечением срока действия в качестве токена является лучшим способом аутентификации вызовов службы и обеспечивает гибкость. Я просто не вижу проблемы с сохранением учетных данных для входа в файл cookie.

person Troy Valle    schedule 29.07.2015
comment
Я думаю, что за этот ответ проголосовали отрицательно, потому что этот вопрос имеет тег C # и привлекает людей с очень низким знанием протокола HTTP. С технической точки зрения, пароль в открытом тексте и этот пароль в виде файла cookie даже более безопасны, чем сеанс, потому что, используя что-то в качестве сеанса или зашифрованного пароля, вы практически добавляете больше способов входа в свою систему. - person Valerio Bozz; 22.09.2018

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

но это не рекомендуется,

person Badr    schedule 20.01.2010

Я думаю, вам нужно создать токен с именем пользователя и зашифрованной строкой аутентификации, которую вы получаете из Windows Identity. Нет необходимости хранить пароль в файле cookie. У нас есть наше приложение, в котором хранится имя пользователя и аутентифицированная строка.

person Jalpesh Vadgama    schedule 20.01.2010

Кстати, хранить пароли не везде безопасно, как на стороне клиента, так и на стороне сервера.

Вам не нужно этого делать.

person Nikkau    schedule 30.01.2010

Что сказал Бранислав и...

Помимо того, что вы не должны помещать конфиденциальные данные в свои файлы cookie, вы также должны защитить их, поместив в свой web.config как минимум следующее:

<httpCookies httpOnlyCookies="true" />

Дополнительные сведения см. в разделе https://stackoverflow.com/questions/33529/how-exactly-do-you-configure-httponlycookies-in-asp-net

person An00bus    schedule 09.04.2013

Это совсем не безопасно. Файлы cookie хранятся на клиентском компьютере, и их можно изменить.

person Bhaskar    schedule 20.01.2010