Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] include z $_GET
desavil
post
Post #1





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

Ostrzeżenie: (0%)
-----


Witam.
Zastanawiam się, czy to co robię jest bezpieczne dla mojego serwisu:
  1. <?php
  2. $get_page = $_GET['page'];
  3. if(!empty($get_page) && preg_match('/^[0-9a-zA-Z\-]*$/i', $get_page) && file_exists('pages/'.$get_page.'.php')){ require('pages/'.$get_page.'.php'); }else{ require('pages/index.php'); }
  4. ?>

Czy już samo preg_match gwarantuje duże bezpieczeństo? Jak z niego wnioskuję nic oprócz podanych znaków/zakresów znaków nie przejdzie, czyli wprowadzenie w $_GET adresu URL, czy też próba wyjścia przed katalog pages (GET=../plik) będzie nie możliwe, gdyż są tam znaczniki które nie przejdą (/ , : .).
Dobrze myślę, czy się mylę? A może muszę jeszcze $get_page przepuścić przez htmlspecialchars, itp?

Tak samo z dodawaniem do bazy, jeżeli dane przejdą przez takiego preg_match'a to nie ma prawa wykonać się żaden sql injection, gdyż nie wprowadzi potencjalny włamywacz znaków, np. = ' " ` itp?

Pozdrawiam!

Ten post edytował desavil 6.03.2012, 08:53:01


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tylko widzisz, zawsze zostaje pytanie czy dobrze napisałeś regułkę REGEXP smile.gif Zabezpieczenie przed SQL injection ma być zawsze, jako dobry nawyk programowania.


--------------------
Go to the top of the page
+Quote Post
desavil
post
Post #3





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

Ostrzeżenie: (0%)
-----


Tak, ale raczej filtrowanie preg_match'em + gotowymi funkcjami do tego celu z PHP, raczej niema sensu?
W tak prostej regułce raczej nie można się pomylić smile.gif

Ten post edytował desavil 6.03.2012, 09:01:22


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
by_ikar
post
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


A po co do tego regexp? Wystarczy zabronić takiemu ludkowi wychodzić katalog wyżej, i będzie mógł wówczas "otworzyć" pliki tylko te które są w danym katalogu. Druga sprawa. Przypisujesz wartość page z zmiennej get, i dopiero po przypisaniu sprawdzasz czy nie jest pusty/istnieje. A to powinieneś zrobić w pierwszej kolejności.. I taki kod może wyglądać mniej więcej tak:

  1. if(!empty($_GET['page']))
  2. {
  3. $page = '/pages/'.basename($_GET['page']).'.php';
  4.  
  5. if(file_exists($page))
  6. {
  7. require $page;
  8. } else
  9. {
  10. // jakis komunikat ze strona nie istnieje
  11. // przekierowanie na stronę błędu (404)
  12. // czy co tam używasz u siebie
  13. }
  14. } else
  15. {
  16. require '/pages/index.php';
  17.  
  18. // strona główna
  19. }


W ten sposób nie musisz używać regexpów, masz możliwość powiadomienia o błędnym adresie. A co do sql injection, jest na to wiele sposobów, a najbardziej skutecznym IMO jest podpinanie zapytań w PDO. Wówczas nie trzeba (co nie znaczy że się nie powinno), się bawić w wyrażenia regularne i/lub filtrowanie wszystkich parametrów.

Ten post edytował by_ikar 6.03.2012, 10:22:03
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 19:06