Безопасные файлы cookie и смешанное использование сайта https / http - PullRequest
51 голосов
/ 02 апреля 2009

Многие сайты поддерживают HTTPS, но не используют безопасные куки. Я хочу, чтобы мой сайт использовал безопасные куки-файлы, но разрешил доступ к некоторому контенту с помощью http.

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

Иметь весь сайт как https - это еще один вариант, но он выглядит немного медленнее, чем обычный http, и поэтому не совсем идеален.

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

Ответы [ 4 ]

31 голосов
/ 02 апреля 2009

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

Причина, по которой он не используется очень часто, может быть одной из:

  • Этот сценарий может быть не очень распространенным. Обычно, если вы заботитесь о безопасности своего сайта, вы ограничиваете сеанс входа в систему только этой защищенной частью, или вы заставляете весь сайт всегда использовать HTTPS (например, Paypal).
  • Существуют уже существующие решения, которые являются безопасными и способны на большее, чем, например, войти в систему кого-либо с помощью формы входа HTTPS и поддерживать этот сеанс при передаче его обратно в HTTP. OpenID является примером. Также подумайте о flickr или gmail: их страница входа всегда HTTPS, но после запуска сеанса вы переходите обратно на HTTP, сохраняя сеанс в безопасности.

Обновление (август 2014)

С тех пор, как я написал это в 2009 году, практика безопасного подключения к экрану входа в систему, но после входа в систему через HTTP-протокол почти исчезла.

Затраты на использование HTTPS по всей стороне больше не рассматриваются как нечто большое. Новый протокол SPDY, впервые внедренный Google (теперь превратился в HTTP / 2), поддерживается кросс-браузерными и крупными веб-серверами и повышает скорость HTTPS.

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

Google даже недавно заявил, что сайты, поддерживающие только HTTPS, начнут выигрывать в рейтинге поисковых систем.

11 голосов
/ 02 апреля 2009

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

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

Если у вас есть данные, которые не соответствуют этим обобщениям, не стесняйтесь делать их по своему усмотрению.

9 голосов
/ 30 октября 2011

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

Почему сайты не используют такой вид настройки и не имеют безопасных файлов cookie?

Я думаю, что основной причиной отсутствия усыновления является управление рисками :

  • Кража токенов сеанса с помощью прослушивания намного сложнее, чем, например, межсайтовый скриптинг (при условии наличия уязвимости). Вам необходим доступ к сети (например, к локальной сети пользователя или провайдеру). Таким образом, в соответствии с приоритетами, основанными на оценке риска, разработчики должны в первую очередь заняться проблемами XSS, поскольку это обеспечивает гораздо большую поверхность атаки (вероятность атаки намного выше).
  • То же самое относится к восстановлению CSRF и пользовательского интерфейса (так называемое «клик-джеккинг»).
  • Если влияние взломанных сеансов на бизнес велико (например, хранение кредитных карт для последующего использования в интернет-магазине), возможно, лучше ограничить весь сайт HTTPS.

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

Есть ли лучший способ добиться того же?

С Справочник хакера веб-приложений :

Если файлы cookie HTTP используются для передачи токенов, они должны быть помечены как secure, чтобы браузер пользователя никогда не передавал их по HTTP. Если возможно, HTTPS следует использовать для каждой страницы приложения, включая статическое содержимое, такое как страницы справки, изображения и т. Д.

Серьезно, заставить весь сайт использовать HTTPS. Несколько лет назад это могло быть невозможным, главным образом из-за того, что CDN не обеспечивают поддержку HTTPS. Однако сегодня это в основном вопрос баланса между затратами на разработку и эксплуатационные расходы.

1 голос
/ 13 мая 2016

Я полностью осознаю, что рекомендуется просто использовать SSL на всем сайте. Однако, безусловно, есть уникальные случаи, когда возможность выбирать между HTTP и HTTPS может пригодиться.

Я столкнулся с сценарием, похожим на @Dsavid Gardner. Моя компания использует стороннего поставщика для управления частью нашего сайта на нашем магазине, и этот магазин находится на поддомене "https://store.mysite.com". У нас есть 15-летний видео-контент, и наш текущий поставщик видео-менеджмента ломается, когда видео встроенный в SSL. (Я предполагаю, что он тянет ресурсы из доменов HTTP, но это еще одна проблема для другого дня)

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

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

Во-первых, Я взял некоторые функции javascript cookie . Идите вперед и поместите этот код в безопасную часть вашего сайта:

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)===' ') { 
            c = c.substring(1,c.length);
        }
        if (c.indexOf(nameEQ) === 0) {
            return c.substring(nameEQ.length,c.length);
        }
    }
    return null;
 }
 function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();

    /* Note, the W3 documents where I got this code didn't include the
    option to set the domain. I added this and it allows the cookie 
    to be shared across sub-domains. Be sure not to add "www" */
    document.cookie = cname + "=" + cvalue + "; " + expires + "; domain=.yourdomain.com";
 }
 /*Now we check our cookies on our secure server to find out if the user is
 logged in or not. In my case, the First Name is stored as a cookie. */
 var firstNameCookie = readCookie("the-secure-cookie-name");
 //
 if(!firstNameCookie){
    /* If the cookie doesn't exist, then the person isn't logged in. Add 
    conditional logic here if you'd like (such as deleting any current 
    logged in cookies from the HTTP portion of the site) */
 }
 else {
    /* otherwise, we have a successful login. By grabbing the cookie via 
    this javascript resting on the secure server, we haven't compromised our 
    security. However, if we set a cookie with javascript right now, it 
    won't be a secure cookie by default and we'll have access to it with 
    HTTP on the subdomain */
    setCookie("HTTPfirstName", firstNameCookie, 1.5);
 }

 */The clients first name is now accessible across subdomains in the cookie
  entitled "HTTPfirstName" */

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...