Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Bezpieczne przekierowanie przez GET
Forum PHP.pl > Forum > Przedszkole
reyne
Witam smile.gif
Napisałem skrypt go.php który wywoływany jest z hiperłączy na mojej stronie w postaci:

go.php?url=http://adrestrony.pl

np:

<a href="go.php?http://gry.pl">strona z grami</a>

tak wygląda kod skryptu
  1. $go = $_GET['url'];
  2. if(isset($go)) {
  3. // w tabeli entries znajduje sie baza linkow
  4. $give = mysql_query("UPDATE `entries` SET `entry_clicks`=`entry_clicks`+'1' WHERE `entry_link`='".$go."'");
  5.  
  6.  
  7. header("Location: ".$go."");
  8.  
  9. }


chodzi o to że skrypt dodaje do bazy kliknięcia w dany link, następnie przekierowuje użytkownika pod dany adres ze zmiennej get - URL.

Wszystko działa, problem pojawia się, kiedy w adresie ze zmiennej $_GET['url'] znajduje się np znak &, wtedy skrypt wariuje, bo jak się domyślam dopisuje to adres do skryptu go.php zamiast przekierowywać.

Pytanie: Jak zrobić żeby to działało poprawnie i bezpiecznie?
CuteOne
1. wiesz jak łatwo zrobić na tym skrypcie SQL Injection..?
2. poczytaj o base64
b4rt3kk
Utnij wszystko co jest zgodne ze wzorcem:

  1. $url = preg_replace('/?[a-zA-Z0-9\&\=]+/', '', $url);
reyne
Domyślam się, że nie jest to bezpieczne dlatego proszę o pomoc, właśnie nie chciałbym kodować adresu, chciałbym żeby użytkownik widział link do jakiego się kieruje, czy jest taka możliwość żeby to było w ten sposób, do tego bezpieczne?

Co do
  1. $url = preg_replace('/?[a-zA-Z0-9\&\=]+/', '', $url);
nie przejdzie ponieważ usunie wtedy z docelowego adresu znak &, który jest potrzebny (inaczej wywoływana strona się nie otworzy)
b4rt3kk
Cytat(reyne @ 6.11.2012, 18:44:25 ) *
Domyślam się, że nie jest to bezpieczne dlatego proszę o pomoc, właśnie nie chciałbym kodować adresu, chciałbym żeby użytkownik widział link do jakiego się kieruje, czy jest taka możliwość żeby to było w ten sposób, do tego bezpieczne?

Co do
  1. $url = preg_replace('/?[a-zA-Z0-9\&\=]+/', '', $url);
nie przejdzie ponieważ usunie wtedy z docelowego adresu znak &, który jest potrzebny (inaczej wywoływana strona się nie otworzy)


Nie przesadziłeś tutaj z cudzysłowami?

  1. header("Location: ".$go."");


a jeśli chodzi o bezpieczeństwo, to filtruj dokładnie dane wpisywane przez użytkownika, najlepiej zastosuj preg_match, co daje pewne zabezpieczenie. Musisz mieć absolutną pewność przed dodaniem czegoś do bazy, że jest to wartość, której oczekujesz, w tym przypadku adres www.
redeemer
Takiego przekierowania w ogóle się nie powinno robić. https://www.owasp.org/index.php/Open_redirect
reyne
czyli nie da się zrobić tego bez filtracji?
sowiq
Zrobić się da.

Inna sprawa, że jeśli chcesz mieć w miarę zabezpieczoną aplikację, to nie możesz zostawić żadnych informacji przychodzących od usera bez filtrowania/walidacji. Nieważne czy to dane z GET, POST, COOKIES, nagłówków czy czegokolwiek innego.

[edit]
Odpowiadając na wcześniejsze pytanie - podawaj adres wyescape'owany funkcją urlencode.
reyne
Ok dzięki Panowie smile.gif
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.