Mam tylko jedną stronę, którą chcę wymusić, aby była dostępna jako strona HTTPS (PHP na Apache). Jak to zrobić, aby cały katalog nie wymagał protokołu HTTPS? Lub, jeśli wysyłasz formularz na stronę HTTPS ze strony HTTP, czy wysyła go przez HTTPS zamiast HTTP?
Oto mój przykład:
http://www.example.com/some-page.php
Chcę, aby był dostępny tylko przez:
https://www.example.com/some-page.php
Jasne, mogę umieścić wszystkie linki do tej strony wskazujące na wersję HTTPS, ale to nie powstrzymuje jakiegoś głupca przed celowym dostępem do niej przez HTTP ...
Jedną z rzeczy, o których pomyślałem, było umieszczenie przekierowania w nagłówku pliku PHP, aby sprawdzić, czy mają dostęp do wersji HTTPS:
if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
header('Location: https://www.example.com/some-page.php');
}
Ale to nie może być właściwy sposób, prawda?
Odpowiedzi:
Sposób, w jaki zrobiłem to wcześniej, jest zasadniczo taki, jak napisałeś, ale nie ma żadnych wartości zakodowanych na stałe:
źródło
(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== "on")
aby naprawić powiadomienia PHP.$_SERVER[]
zmienne nie są zmienne / podatne na interwencję użytkowników?HTTP_X_FORWARDED
, i można nimi manipulować, ale inne lubiąHTTPS
lubSERVER_PORT
są ustawiane bezpośrednio z serwera internetowego i zwykle powinny być bezpieczne.Możesz to zrobić za pomocą dyrektywy i mod_rewrite na Apache:
Jeśli chcesz, możesz z czasem ulepszyć Lokalizację, używając wyrażeń regularnych .
źródło
Należy zmusić klienta do żądania protokołu HTTPS zawsze z nagłówkami HTTP Strict Transport Security (HSTS):
Należy pamiętać, że HSTS jest obsługiwany w większości nowoczesnych przeglądarek, ale nie jest uniwersalny. W związku z tym powyższa logika ręcznie przekierowuje użytkownika niezależnie od obsługi, jeśli kończy się na HTTP, a następnie ustawia nagłówek HSTS tak, aby dalsze żądania klientów były przekierowywane przez przeglądarkę, jeśli to możliwe.
źródło
Właśnie utworzyłem plik .htaccess i dodałem:
Prosty !
źródło
źródło
Musiałem zrobić coś takiego podczas pracy za modułem równoważenia obciążenia. Wskazówka dotycząca kapelusza https://stackoverflow.com/a/16076965/766172
źródło
Sposób PHP:
Sposób mod_rewrite Apache:
źródło
http://www.besthostratings.com/articles/force-ssl-htaccess.html
Czasami może zajść potrzeba upewnienia się, że użytkownik przegląda witrynę, korzystając z bezpiecznego połączenia. Łatwy sposób na zawsze przekierowanie użytkownika do bezpiecznego połączenia (https: //) można osiągnąć za pomocą pliku .htaccess zawierającego następujące wiersze:
Należy pamiętać, że plik .htaccess powinien znajdować się w głównym folderze witryny internetowej.
Jeśli chcesz wymusić HTTPS dla określonego folderu, możesz użyć:
Plik .htaccess należy umieścić w folderze, w którym chcesz wymusić HTTPS.
źródło
Ok .. Teraz jest na ten temat mnóstwo rzeczy, ale nikt tak naprawdę nie odpowiada na pytanie „Bezpieczne”. Dla mnie używanie czegoś, co jest niepewne, jest absurdalne.
Chyba że użyjesz go jako przynęty.
Propagacja $ _SERVER może zostać zmieniona na życzenie kogoś, kto wie jak.
Również, jak stwierdzili Sazzad Tushar Khan i thebigjc, możesz również użyć httaccess, aby to zrobić, a tutaj jest wiele odpowiedzi, które go zawierają.
Poprostu dodaj:
do końca tego, co masz w swoim .httaccess i to wszystko.
Wciąż nie jesteśmy tak bezpieczni, jak to tylko możliwe dzięki tym 2 narzędziom.
Reszta jest prosta. Jeśli brakuje atrybutów, tj ...
Powiedz również, że zaktualizowałeś swój plik httaccess i sprawdziłeś:
Jest o wiele więcej zmiennych, które możesz sprawdzić, np.
HOST_URI
(Jeśli istnieją statyczne atrybuty tego do sprawdzenia)HTTP_USER_AGENT
(Różne wartości w tej samej sesji)Więc wszystko, co mówię, to nie poprzestawać na jednym lub drugim, gdy odpowiedź leży w kombinacji.
Aby uzyskać więcej informacji na temat przepisywania httaccess, zobacz dokumentację-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
Some Stacks here -> Force SSL / https using .htaccess and mod_rewrite
and
Getting the full URL of the bieżąca strona (PHP),
aby nazwać parę.
źródło
ERR_TOO_MANY_REDIRECTS
. Jak to naprawić?Użyj,
$_SERVER['HTTPS']
aby sprawdzić, czy jest to SSL , i przekieruj we właściwe miejsce, jeśli nie.I pamiętaj, strona, na której jest wyświetlany formularz, nie musi być zasilana przez HTTPS, to adres zwrotny postu, który najbardziej tego potrzebuje.
Edycja : tak, jak wskazano poniżej, najlepiej jest mieć cały proces w HTTPS. To o wiele bardziej uspokajające - zwracałem uwagę, że post jest najbardziej krytyczną częścią. Musisz również uważać, aby wszystkie pliki cookie były ustawione jako bezpieczne, więc będą wysyłane tylko przez SSL. Rozwiązanie mod_rewrite jest również bardzo sprytne, użyłem go do zabezpieczenia wielu aplikacji na mojej własnej stronie internetowej.
źródło
zastosowanie
htaccess
:źródło
Nie mieszaj HTTP i HTTPS na tej samej stronie. Jeśli masz stronę formularza, która jest obsługiwana przez HTTP, będę się denerwować przesyłaniem danych - nie mogę sprawdzić, czy przesyłanie przechodzi przez HTTPS lub HTTP bez wykonania widoku źródła i szukania go.
Dostarczanie formularza przez HTTPS wraz z linkiem do przesyłania nie jest tak dużą zmianą na korzyść.
źródło
Jeśli używasz Apache lub czegoś takiego jak LiteSpeed, który obsługuje pliki .htaccess, możesz wykonać następujące czynności. Jeśli nie masz jeszcze pliku .htaccess, powinieneś utworzyć nowy plik .htaccess w swoim katalogu głównym (zwykle tam, gdzie znajduje się plik index.php). Teraz dodaj te linie jako pierwsze reguły przepisywania w twoim .htaccess:
Potrzebujesz instrukcji "RewriteEngine On" tylko raz w swoim .htaccess dla wszystkich reguł przepisywania, więc jeśli już ją masz, po prostu skopiuj drugą i trzecią linię.
Mam nadzieję, że to pomoże.
źródło
Korzystanie z tego nie wystarczy:
Jeśli masz jakiekolwiek treści http (np. Zewnętrzne źródło obrazu http), przeglądarka wykryje potencjalne zagrożenie. Więc upewnij się, że wszystkie ref i src w kodzie to https
źródło
Przeszedłem przez wiele rozwiązań sprawdzających stan $ _SERVER [HTTPS], ale wydaje mi się, że nie jest on niezawodny, ponieważ czasami nie włącza się, wyłącza itp., Powodując przekierowanie skryptu do wewnętrznej pętli.
Oto najbardziej niezawodne rozwiązanie, jeśli Twój serwer obsługuje usługę $ _SERVER [SCRIPT_URI]
Zwróć uwagę, że w zależności od twojej instalacji, twój serwer może nie obsługiwać $ _SERVER [SCRIPT_URI], ale jeśli tak, to jest to lepszy skrypt.
Możesz sprawdzić tutaj: Dlaczego niektóre instalacje PHP mają $ _SERVER ['SCRIPT_URI'], a inne nie
źródło
Dla osób korzystających z usług IIS dodanie tego wiersza w pliku web.config pomoże:
Pełny przykładowy plik
źródło
Nie powinieneś ze względów bezpieczeństwa. Zwłaszcza jeśli w grę wchodzą pliki cookie. Powoduje to, że jesteś otwarty na ataki typu „powtórka” oparte na plikach cookie.
Tak czy inaczej, powinieneś użyć reguł kontroli Apache, aby go dostroić.
Następnie możesz przetestować, czy protokół HTTPS jest włączony i w razie potrzeby przekierować.
Powinieneś przekierowywać do strony płatności tylko za pomocą FORMULARZA POSTU (bez POST), a dostęp do strony bez POST powinien być kierowany z powrotem na inne strony. (To złapie ludzi po prostu skaczących.)
http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/
To dobre miejsce na rozpoczęcie, przepraszam, że nie zapewniam więcej. Ale naprawdę powinieneś wszystko przepchnąć przez SSL.
To nadmierna ochrona, ale przynajmniej masz mniej zmartwień.
źródło
może ten może pomóc, ty, tak zrobiłem dla mojej strony, działa jak marzenie:
źródło
Jeśli chcesz użyć do tego PHP, ten sposób zadziałał dla mnie naprawdę dobrze:
Sprawdza zmienną HTTPS w superglobalnej tablicy $ _SERVER, aby zobaczyć, czy jest równa „on”. Jeśli zmienna nie jest równa on.
źródło
Użyłem tego skryptu i działa dobrze na stronie.
źródło
Tak proste.
źródło