Что нужно знать разработчику PHP о соединениях на уровне https / secure socket? - PullRequest
10 голосов
/ 15 сентября 2008

Я почти ничего не знаю, когда речь идет о том, как и почему HTTPS-соединений. Очевидно, что когда я передаю защищенные данные, такие как пароли или данные кредитной карты, https является важным инструментом. Что мне нужно знать об этом, хотя? Каковы наиболее распространенные ошибки, которые вы видите, когда разработчики делают это в своих проектах? Бывают ли времена, когда https - просто плохая идея? Спасибо!

Ответы [ 7 ]

24 голосов
/ 16 сентября 2008

HTTPS, или SSL-сертификат, используется для сайта и обычно подписывается центром сертификации (ЦС), который фактически является доверенной третьей стороной, которая проверяет некоторые базовые сведения о вашем сайте и сертифицирует это для использования в браузерах. Если ваш браузер доверяет CA, то он доверяет любым сертификатам, подписанным этим CA (это называется цепочкой доверия).

Каждый HTTP (или HTTPS) запрос состоит из двух частей: запроса и ответа. Когда вы запрашиваете что-то через HTTPS, в фоновом режиме происходит несколько вещей:

  • Клиент (браузер) выполняет «рукопожатие», когда запрашивает открытый ключ и идентификацию сервера.
    • В этот момент браузер может проверить правильность (соответствует ли имя сайта? Текущий диапазон дат? Подписано ли оно ЦС, которому доверяет?). Он может даже связаться с центром сертификации и убедиться, что сертификат действителен.
  • Клиент создает новый предварительный главный секрет, который шифруется с использованием открытого ключа сервера (так что только сервер может его расшифровать) и отправляется на сервер
  • Сервер и клиент оба используют этот предварительный главный секрет для генерации главного секрета, который затем используется для создания симметричного сеансового ключа для фактического обмена данными
  • Обе стороны отправляют сообщение о том, что они сделали рукопожатие
  • Затем сервер обрабатывает запрос в обычном режиме, а затем шифрует ответ, используя сеансовый ключ

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

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

Подробнее о продолжительности сеансов см. Как долго действует симметричный ключ HTTPS?

Сертификаты и имена хостов

Сертификатам присваивается общее имя (CN), которое для HTTPS является доменным именем. CN должен точно соответствовать, например, сертификат с CN «example.com» НЕ будет соответствовать домену «www.example.com», и пользователи получат предупреждение в своем браузере.

До SNI было невозможно разместить несколько доменных имен на одном IP. Поскольку сертификат выбирается еще до того, как клиент отправляет фактический HTTP-запрос, а HTTP-запрос содержит строку заголовка Host:, которая сообщает серверу, какой URL-адрес использовать, у сервера нет способа узнать, какой сертификат следует использовать для данного запрос. SNI добавляет имя узла к части рукопожатия TLS, и поэтому, пока оно поддерживается как на клиенте, так и на сервере (а в 2015 году оно широко поддерживается), сервер может выбрать правильный сертификат.

Даже без SNI одним из способов обслуживания нескольких имен хостов является использование сертификатов, включающих альтернативные имена субъектов (SAN), которые по сути являются дополнительными доменами, для которых действителен сертификат. Например, Google использует один сертификат для защиты многих своих сайтов.

Google SSL certificate

Другой способ - использовать групповые сертификаты. Можно получить сертификат типа « .example.com», в этом случае «www.example.com» и «foo.example.com» будут действительными для этого сертификата. Однако обратите внимание, что «example.com» не соответствует « .example.com», а также «foo.bar.example.com». Если вы используете «www.example.com» для своего сертификата, вы должны перенаправить кого-либо с «example.com» на «www». сайт. Если они запрашивают https://example.com,, если вы не размещаете его на отдельном IP-адресе и не имеете двух сертификатов, вы получите ошибку сертификата.

Конечно, вы можете смешивать как подстановочные знаки, так и SAN (при условии, что ваш CA позволяет это делать) и получить сертификат как для "example.com", так и для SAN " .example.com", "example .net "и" .example.net ", например.

Форма

Строго говоря, если вы отправляете форму, не имеет значения, если сама страница формы не зашифрована, если отправляемый URL переходит на https: // URL. В действительности, пользователи были обучены (по крайней мере, теоретически) не отправлять страницы, если они не видят маленький «значок замка», поэтому даже сама форма должна быть предоставлена ​​через HTTPS, чтобы получить это.

Трафик и загрузка сервера

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

Лучшие практики

  • Если вы не просто используете HTTPS для всего сайта, он должен автоматически перенаправить на HTTPS по мере необходимости. Каждый раз, когда пользователь входит в систему, он должен использовать HTTPS, а если вы используете сеансовые куки-файлы, для куки-файла должен быть установлен безопасный флаг . Это предотвращает перехват cookie-файлов сеанса, что особенно важно, учитывая популярность открытых (незашифрованных) сетей Wi-Fi.

  • Любые ресурсы на странице должны исходить из той же схемы, что и страница. Если вы попытаетесь получить изображения с http: //, когда страница загружена по протоколу HTTPS, пользователь получит предупреждения безопасности. Вы должны либо использовать полностью определенные URL-адреса, либо другой простой способ - использовать абсолютные URL-адреса, которые не включают имя хоста (например, src = "/ images / foo.png"), поскольку они работают для обоих.

    • Сюда входят внешние ресурсы (например, Google Analytics)
  • Не выполнять POST (отправка формы) при переходе с HTTPS на HTTP. Большинство браузеров помечают это как предупреждение системы безопасности.

6 голосов
/ 16 сентября 2008

В общем, я не буду углубляться в SSL, gregmac отлично поработал над этим, см. Ниже; -).

Однако, некоторые из наиболее распространенных (и критических) ошибок, совершенных (не только PHP) в отношении использования SSL / TLS:

  1. Разрешение HTTP, когда вы должны применять HTTPS
  2. Извлечение некоторых ресурсов по HTTP со страницы HTTPS (например, изображений, IFRAME и т. Д.)
  3. Непреднамеренное обращение к странице HTTP со страницы HTTPS - обратите внимание, что это включает в себя «поддельные» страницы, такие как «about: blank» (я видел, что это используется в качестве заполнителей IFRAME), это излишне и неприятно всплывет предупреждение.

  4. Веб-сервер, настроенный для поддержки старых, небезопасных версий SSL (например, SSL v2 распространен, но ужасно сломан) (хорошо, это не совсем проблема программиста, но иногда никто не справится с ней ...)

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

  6. Самозаверяющие сертификаты - не позволяют пользователям проверять личность сайта.

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

  8. Незащищенный файл cookie - файлы cookie, связанные с безопасностью (такие как sessionId, токен аутентификации, токен доступа и т. Д.) ДОЛЖЕН быть установлен с установленным атрибутом «secure». Это важно! Если он не установлен как безопасный, файл cookie безопасности, например, SessionId, может передаваться по HTTP (!) - и злоумышленники могут гарантировать, что это произойдет - и, таким образом, разрешить перехват сеанса и т. Д. Пока вы это делаете (хотя это не имеет прямого отношения), также установите атрибут HttpOnly в файлах cookie (помогает смягчить некоторые XSS).

  9. Излишне разрешительные сертификаты - скажем, у вас есть несколько поддоменов, но не все из них имеют одинаковый уровень доверия. Например, у вас есть www.yourdomain.com, dowload.yourdomain.com и publicaccess.yourdomain.com. Так что вы можете подумать о переходе с подстановочным сертификатом .... НО у вас также есть secure.yourdomain.com или finance.yourdomain.com - даже на другом сервере. Затем publicaccess.yourdomain.com сможет выдать себя за secure.yourdomain.com .... Хотя могут быть случаи, когда это нормально, обычно требуется разделение привилегий ...

Это все, что я помню сейчас, возможно, отредактирую это позже ...

Что касается ПЛОХОЙ идеи использовать SSL / TLS - если у вас есть общедоступная информация, НЕ предназначенная для конкретной аудитории (ни для одного пользователя, ни для зарегистрированных пользователей), И вы не особенно заинтересованы в их получении это определенно из правильного источника (например, значения биржевого индикатора ДОЛЖНЫ поступать из аутентифицированного источника ...) - тогда нет никаких реальных причин нести накладные расходы (и не только производительность ... dev / test / cert / etc).

Однако, если у вас есть общие ресурсы (например, один и тот же сервер) между вашим сайтом и другим сайтом MORE SENSITIVE, то более чувствительный сайт должен устанавливать здесь правила.

Кроме того, пароли (и другие учетные данные), информация о кредитной карте и т. Д. Должны ВСЕГДА превышать SSL / TLS.

1 голос
/ 15 сентября 2008

Я бы сказал, что наиболее распространенными ошибками при работе с сайтом с поддержкой SSL являются

  1. Сайт ошибочно перенаправляет пользователей на http со страницы как https
  2. Сайт не переключается автоматически на https, когда это необходимо
  3. Изображения и другие ресурсы на странице https загружаются через http, что вызовет предупреждение безопасности из браузера. Убедитесь, что все ресурсы используют полные URI, которые указывают https.
  4. Сертификат безопасности работает только для одного субдомена (например, www), но ваш сайт фактически использует несколько субдоменов. Обязательно получите подстановочный сертификат, если он вам понадобится.
1 голос
/ 15 сентября 2008

Убедитесь, что на странице HTTPS все элементы на этой странице происходят с адреса HTTPS. Это означает, что элементы должны иметь относительные пути (например, "/images/banner.jpg"), чтобы протокол был унаследован, или чтобы вам пришлось проверять каждую страницу, чтобы найти протокол, и использовать его для всех элементов.

Примечание: сюда входят все внешние ресурсы (например, файлы JavaScript Google Analytics)!

Единственный недостаток, который я могу вспомнить, это то, что он добавляет (почти незначительное) время обработки для браузера и вашего сервера. Я бы предложил шифровать только те передачи, которые должны быть.

0 голосов
/ 17 октября 2008

Я обнаружил, что попытка <link> для несуществующей таблицы стилей также вызвала предупреждения безопасности. Когда я использовал правильный путь, появился значок блокировки.

0 голосов
/ 16 сентября 2008

Все очень хорошие советы здесь ... но я просто хочу добавить кое-что ..
Я видел некоторые сайты, которые предоставляют вам страницу входа в http и перенаправляют вас на https только после того, как вы отправите свое имя пользователя / пароль. Это означает, что имя пользователя передается в открытом виде перед установлением соединения https ..

Короче говоря, сделайте страницу, на которой вы входите из ssl, вместо публикации на странице ssl.

0 голосов
/ 15 сентября 2008

Я бы предложил в любое время любые пользовательские данные хранятся в базе данных и передаются, используйте https. Учитывайте это требование, даже если пользовательские данные являются обыденными, потому что даже многие из этих обыденных деталей используются этим пользователем для идентификации себя на других веб-сайтах. Рассмотрите все случайные вопросы безопасности, которые задает вам ваш банк (например, на какой улице вы живете?). Это можно легко взять из полей адреса. В этом случае данные - это не то, что вы считаете паролем, но это может быть и так. Кроме того, вы никогда не сможете предвидеть, какие пользовательские данные будут использоваться для вопросов безопасности в других местах. Вы также можете ожидать, что благодаря интеллекту среднего пользователя сети (подумайте о своей бабушке) этот кусок информации может составить часть пароля этого пользователя где-то еще.

Один указатель, если вы используете https

сделать так, чтобы, если пользователь печатал http://www.website -that-needs-https.com / и т.д. / yadda.php они будут автоматически перенаправлены на https://www.website -that-needs-https.com / и т.д. / yadda.php (личная любимая мозоль)

Однако, если вы просто делаете простую html-страницу, это будет по существу односторонняя передача информации с сервера пользователю, не беспокойтесь об этом.

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