2013-06-05 2 views
3

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

Я пробовал смотреть подписчиков, используя NewRequest. Я сделал что-то вроде этого:

@subscriber(NewRequest) 
def modify_protocol(event): 
    if re.search('some string', event.request.host_url): 
     event.request.scheme = 'https' 

Однако это не делать то, что я ожидал. Страница все еще отображается. Любые идеи были бы хорошы.

Заранее спасибо.

ответ

0

Некоторые незапрашиваемые советы - не перенаправлять на SSL с не-SSL.

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

Лучше предоставить страницу, которая предупреждает пользователя, и предоставляет для них текстовую ссылку.

+0

Хороший совет, но ссылки https на странице http так же легко скомпрометированы, как перенаправления. – imsky

+0

Eh. По крайней мере, пользователь достаточно занят, чтобы понять, что они не являются SSL'd и должны нажать на URL. Каждый раз, когда я нажимаю явно указанный URL, я всегда дважды проверяю строку URL. Когда я получаю магическое направление, я просто продолжаю просмотр. Я бы предпочел немного откликнуться и немного поработать над собой, чем получить автоматическое перенаправление и не предлагать эту возможность. Вы можете столкнуться с менеджером среднего звена или «javascript», который делает аргумент о простоте использования для пользователей, но - безопасные сайты лучше, чем клиенты, получающие MITM'd. – synthesizerpatel

+0

Я с вами, но любой текст можно заменить на небезопасной странице, так что всегда существует угроза атаки MITM без какого-либо уведомления пользователя (например, они даже не видят ссылку на обычный текст). HSTS - лучшее, что у нас есть до сих пор, OWASP отказался от рекомендаций против перенаправления, потому что http всегда будет открытым вектором. – imsky

7

Внутри вида:

if req.scheme == "http": 
     return HTTPFound("https://" + req.host + req.path_qs) 

Использование слушателя событий:

@subscriber(NewRequest) 
def redirect(event): 
    if event.request.scheme == "http": 
     raise HTTPFound("https://" + event.request.host + event.request.path_qs) 

Я посмотрел на подходы с использованием send и get_response, но не смог найти много.

+0

Спасибо, я попробую это. Я по-прежнему считаю, что лучшим решением является изменение файла конфигурации веб-сервера, чтобы переписать его при попадании http. Мне просто интересно, как вы можете это сделать на уровне приложений. Я пробовал это, и он не работает. :(У меня были большие надежды. – ericg

+0

Вы говорите, что я написал не работает? Я тестировал оба варианта, они хорошо работали. – imsky

+1

Это работает, просто убедитесь, что 'req' заменен объектом запроса, который вы передали в свой вид В моем случае я использую все слово «запрос», поэтому оно становится request.scheme и т. Д. –