Как я могу запретить доступ к файлам PHP, если вызывающая сторона не использует HTTPS?

Я написал несколько веб-сервисов PHP, где я передаю аргументы через URL. Чтобы предотвратить несанкционированный доступ, я передаю уникальный ключ в качестве одного из аргументов. Я вызываю файл PHP через HTTPS, и мне интересно, есть ли способ предотвратить запуск сценария, если HTTPS не используется.

5 ответов

Решение

Немного не по теме, но если вы используете PHP с Apache Httpd и mod_ssl, вы можете принудительно получить доступ SSL к файлам (и сценариям PHP), поместив SSLRequireSSL директива в .htaccess или в конфигурации Справочника.

if(empty($_SERVER['HTTPS'])) {
    // ....
    exit;
}

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

Mozilla старается решить эту проблему. Начиная с Firefox 4 сервер может отправлять Strict-Transport-Security заголовок, который впоследствии предотвратит незашифрованный доступ (хотя очевидно, что перед отправкой заголовка незашифрованный доступ все же может иметь место).

Дальнейшее чтение на hacks.mozilla.org

Если вы используете Apache, вы можете использовать mod_rewrite для перенаправления http-запросов на https.

Например, это то, что мы используем:

RewriteCond %{HTTPS} !=on
RewriteRule ^account(.*) https://%{SERVER_NAME}/account$1   [R=301,L]

Это перенаправляет http://domain/account на https://domain/account

Вы можете запретить серверу отвечать на незашифрованный запрос, но вы не можете предотвратить его отправку клиентом, что также плохо для защиты пароля. И это далеко не самая страшная проблема с введением секретного токена в URL: он остается в истории браузера, его можно увидеть в реферере, когда пользователь покидает ваш сайт, и любой веб-сайт, который посещает пользователь, может запустить грубую принудительная или словарная атака через :visited CSS псевдокласс. В общем, это довольно ужасная идея - вам лучше использовать куки-файлы только с SSL.

Другие вопросы по тегам