2012-05-24 1 views
5

Если я использую функцию PHP fopen() для извлечения данных с веб-сайта HTTPS, это то, что можно назвать безопасным соединением HTTPS. т.е. обеспечивает ли он защиту от атак типа «человек в середине» и «подслушивание»?Предоставляет ли PHP fopen() защиту от типичных атак при доступе к ресурсам https?

ответ

5

Не по умолчанию, нет.

Он всегда будет обеспечивать защиту от простых подслушивающих атак, поскольку данные всегда будут зашифрованы (до тех пор, пока сервер SSL, к которому вы подключаетесь, позволяет использовать хотя бы один зашифрованный шифр - да, шифры с нулевым шифрованием разрешены в соединениях HTTPS: roll-eyes :) Однако по умолчанию он не будет защищать от man-in-the-middle, поскольку он не проверяет сертификаты сервера, поэтому вы не можете быть уверены, что вы подключились к предназначенный сервер.

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

$context = stream_context_create(array(
    'ssl' => array(
     'cafile'  => 'ca_bundle.crt', 
     'verify_peer' => true 
    ) 
)); 

$file = fopen($url, 'r', false, $context); 
+0

Еще одна вещь, которую вы можете захотеть, - ограничить допустимый набор шифров только разрешенными сильными формами шифрования. Самый сильный доступный шифр (разрешенный как клиентом, так и сервером) должен использоваться по умолчанию; однако, если вы действительно суетливы, вы можете отказаться от подключения к серверам, которые не поддерживают достаточно высокий уровень шифрования. Если кто-то знает, как это сделать на PHP, отправьте сообщение. – Cheekysoft

Смежные вопросы