Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Bezpieczne przekierowanie po zalogowaniu
Forum PHP.pl > Forum > Przedszkole
Laran
Hej.

Po zalogowaniu użytkownika chce go bezpiecznie przekierować na poprzednią stronę . Poprzez "bezpiecznie" mam na myśli że będzie to przekierowanie odporne na "majsterkowanie" innych i użytkownik zostanie przekierowany na poprzednią stronę (lub w najgorszym przypadku [jeśli ktoś zacznie "majsterkować"] użytkownik zostanie przekierowany na inną stronę, ale nadal w mojej domenie). Napisałem coś takiego:

W formularzu znajduje się to:
  1. <input type="hidden" name="location" value="<?php echo $_SERVER['HTTP_REFERER']?>" />


A kod przekierowania to:
  1. if($login) {
  2. if($_GET['location']) {
  3. $url = escape(trim($_GET['location']));
  4. $res = parse_url($url);
  5.  
  6. if($res['scheme'] === 'http' && $res['host'] === 'mojastrona.pl') {
  7. header('Location: '.$url);
  8. exit();
  9. } else {
  10. header('Location: index.php');
  11. exit();
  12. }
  13. } else {
  14. header('Location: index.php');
  15. exit();
  16. }
  17. }


Funkcja escape() to:
  1. function escape($string) {
  2. return htmlentities($string, ENT_QUOTES, 'UTF-8');
  3. }


Czy to jest bezpieczne? Zapomniałem o czymś? smile.gif
Turson
Wygląda raczej dobrze, ale wystarczy, że zapiszesz adres poprzedniej strony w sesji, a jeżeli adres istnieje w sesji to przekierowujesz i usuwasz adres z sesji.
Damonsson
Ale co to ma wspólnego z bezpieczeństwem? Przekierowanie, jak przekierowanie. To na stronie na którą przekierowujesz, musisz sprawdzać czy ktoś ma uprawnienia do jej oglądania, bo jak trzymasz tam nr konta i hasło do banku, gdzie trzymasz 1.000.000.000$ to zawsze ktoś może 10 lat wpisywać różne URL i sobie zgadnąć w końcu.
Laran
Cytat(Damonsson @ 14.06.2014, 12:50:51 ) *
To na stronie na którą przekierowujesz, musisz sprawdzać czy ktoś ma uprawnienia do jej oglądania, bo jak trzymasz tam nr konta i hasło do banku, gdzie trzymasz 1.000.000.000$ to zawsze ktoś może 10 lat wpisywać różne URL i sobie zgadnąć w końcu.



Chodzi o to by użytkownik trafiał na index.php jeśli adres podany w "location" jest linkiem zewnętrznym. Chyba, że coś pomyliłem:P
Damonsson
Jak będzie mógł zmienić wartość w value, to i zmieni sobie action w form'ie i tyle z Twoich zabezpieczeń.
Laran
Cytat(Damonsson @ 14.06.2014, 13:11:10 ) *
Jak będzie mógł zmienić wartość w value, to i zmieni sobie action w form'ie i tyle z Twoich zabezpieczeń.




Facepalm. Przynajmniej po przekierowaniu z innej witryny na stronę logowania nie zostaje wysłany spowrotem na tamtą stronę, ale na index.php.
Damonsson
Ok, chyba czegoś nie rozumiem. Przed czym Ty chcesz się zabezpieczać?

I w czym to:
  1. if($login) {
  2. if($_GET['location']) {
  3. $url = escape(trim($_GET['location']));
  4. $res = parse_url($url);
  5.  
  6. if($res['scheme'] === 'http' && $res['host'] === 'mojastrona.pl') {
  7. header('Location: '.$url);
  8. exit();
  9. } else {
  10. header('Location: index.php');
  11. exit();
  12. }
  13. } else {
  14. header('Location: index.php');
  15. exit();
  16. }
  17. }


jest bezpieczniejsze od tego:

  1. if($login) {
  2. if($_GET['location']) {
  3. header('Location: '.$url);
  4. exit();
  5. } else {
  6. header('Location: index.php');
  7. exit();
  8. }
  9. }

?

Do głowy przychodzi mi tylko opcja, że dajesz możliwość userom, Tworzenia jakichś ich własnych ograniczonych formularzy.
Laran
Pole "location" zawiera rezultat $_SERVER['HTTP_REFERER']. Jeśli ktoś został przekierowany z www.example.com na stronę logowania i się zaloguje poprawnie to zostanie przekierowany spowrotem na www.example.com (bo to był jego REFERER). Jednak gdy adres zostanie sprawdzony i link okaże się stroną zewnętrzną to przekierowany na index.php.

PS. Sorry, w przykładzie był błąd. To jest $_POST['location'], a nie $_GET['location'].
Damonsson
Dla mnie to i tak nie ma najmniejszego sensu. Ale jak widzisz w tym jakiekolwiek zabezpieczenie to niech będzie.
Laran
Cytat(Damonsson @ 14.06.2014, 18:56:19 ) *
Dla mnie to i tak nie ma najmniejszego sensu. Ale jak widzisz w tym jakiekolwiek zabezpieczenie to niech będzie.


Do tego że nie daje to żadnych zabezpieczeń doszliśmy wcześniej. Mimo wszystko zostawie ten kod z racji tych przekierowań. Dzięki za pomoc, można zamknąć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.