Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Czy tak powinno wyglądać ładowanie plików w CMS
Forum PHP.pl > Forum > Przedszkole
amii
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
.radex
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
amii
.radex może jakiś przykład jak to się robi wink.gif
Turson
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.
mkdes
Pliki ładuj raczej tak:
Kod
include(dirname(__FILE__).'/includes/plik.php');
vokiel
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.
amii
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ę.
vokiel
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' ?
amii
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

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.