Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Czy tak powinno wyglądać ładowanie plików w CMS
amii
post
Post #1





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Piszę coś na kształt systemu CMS. Mój index.php wygląda tak jak poniżej. Chciałem się spytać czy header i footer są ładowane pojedynczo czy przy każdym wczytaniu innej strony ? Strony są wczytywane na zasadzie index.php?p=nazwa_strony

  1. require_once('functions.php');
  2.  
  3. foreach ($_GET as $key => $value) {$$key = $value;}
  4.  
  5. foreach ($_POST as $key => $value) {$$key = $value;}
  6.  
  7.  
  8.  
  9. if(!isset($p)) {$p="main";}
  10.  
  11.  
  12. include_once('header.php'); //naglowek strony
  13. if(file_exists('view/'.$p.'.php')) include('view/'.$p.'.php'); //tresc strony
  14. include_once('footer.php'); //stopka


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
.radex
post
Post #2





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Nigdy, _nigdy_ tak nie rób.

Robiąc "foreach ($_GET as $key => $value) {$$key = $value;}" pozwalasz komukolwiek z zewnątrz "wstrzyknąć" dowolną zmienną jaką sobie zażyczy — a to potencjalnie może umożliwić atak.

Co więcej, pozwalasz zaincludować dowolny plik jaki potencjalny atakujący chce. Tego też nie chcemy.

---

Odnośnie pytania — robi się tak, że jest tylko jeden plik, który wyświetla treść (index.php) — i po prostu przekazuje się jaką podstronę ma wyświetlić.

Oczywiście robi się to "trochę" inaczej niż Ty wink.gif


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
amii
post
Post #3





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


.radex może jakiś przykład jak to się robi wink.gif


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Turson
post
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Cytat(.radex @ 1.05.2011, 19:06:34 ) *
Nigdy, _nigdy_ tak nie rób.

Robiąc "foreach ($_GET as $key => $value) {$$key = $value;}" pozwalasz komukolwiek z zewnątrz "wstrzyknąć" dowolną zmienną jaką sobie zażyczy — a to potencjalnie może umożliwić atak.

Co więcej, pozwalasz zaincludować dowolny plik jaki potencjalny atakujący chce. Tego też nie chcemy.

---

Odnośnie pytania — robi się tak, że jest tylko jeden plik, który wyświetla treść (index.php) — i po prostu przekazuje się jaką podstronę ma wyświetlić.

Oczywiście robi się to "trochę" inaczej niż Ty wink.gif

Powiedzmy, że masz link index.php?podstrona=kontakt
Wykorzystujesz wtedy $_GET, w skrócie jeśli zmienna podstronna = kontakt, includujesz dany plik.
Go to the top of the page
+Quote Post
-mkdes-
post
Post #5





Goście







Pliki ładuj raczej tak:
Kod
include(dirname(__FILE__).'/includes/plik.php');
Go to the top of the page
+Quote Post
vokiel
post
Post #6





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Zrób sobie listę plików, którą możesz użyć. Do tego masz 2 podstawowe opcje:
1. Tworzysz sobie tą listę na stałe, z palca wpisując do tablicy nazwy plików.
2. Skanujesz katalog z podstronami w poszukiwaniu plików i dynamicznie dodajesz je do tablicy.

Teraz pobierając nazwę podstrony z GET, sprawdzasz czy jest w tablicy dozwolonych, jeśli jest, to ją dołączasz, jeśli nie, to wyświetlasz domyślną lub stronę z błędem 404.


--------------------
Go to the top of the page
+Quote Post
amii
post
Post #7





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Jak na moje to ta linijka poniżej nie pozwala zainkludować żadnego pliku z zewnątrz włamywacz musiałby najpierw zgrać swój plik na serwer do podkatalogu view
  1. if(file_exists('view/'.$p.'.php')) include('view/'.$p.'.php'); //tresc strony


Co do zmiennych to i tak według mnie można dowolnie manipulować przesłanym nagłówkiem i danymi POST / GET więc tu też zagrożenia nie widzę.


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
vokiel
post
Post #8





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Bardzo dobrze, że sprawdzasz czy plik istnieje, i podajesz konkretną ścieżkę, ale...
W Twoim przykładzie jest:
  1. if(!isset($p)) {$p="main";}
  2. include_once('header.php'); //naglowek strony
  3. if(file_exists('view/'.$p.'.php')) include('view/'.$p.'.php'); //tresc strony
  4. include_once('footer.php'); //stopka

Co jeśli $p będzie ustawione na:
1. 'plik_ktory_nie_istnieje' ?
2. '../../../../etc/passwd', lub np.: '../../config/database.ini' ?


--------------------
Go to the top of the page
+Quote Post
amii
post
Post #9





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Odpowiadając na pytanie - nie załaduje nic oprócz header.php i footer.php bo nie spełni warunku ? Dla mnie takie coś jest ok, ewentualnie żeby było zgrabniej można dorzucić drugi warunek:
Jeśli chodzi o luki w bezpieczeństwie to ja żadnych nie widzę w tym schemacie.

  1. if(!isset($p) || (!file_exists('view/'.$p.'.php')) {$p="main";} //jeśli nie ma zmiennej $p lub nie ma pliku to ładujemy main.php
  2. include_once('header.php'); //naglowek strony
  3. include_once('view/'.$p.'.php'); //tresc strony
  4. include_once('footer.php'); //stopka



--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
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: 22.08.2025 - 08:17