Jeden szkielet, wiele podstron

0

Witam, od niedawna interesuje się zabawą z PHP. Chciałbym stworzyć u siebie podstrony doczepiane do głównej strony, aby nie dublować całego szkieletu strony za każdym razem. Jaki sposób na to rozwiązanie jest najlepszy? Czy taki kod jak poniżej jest "dobry"?

           <?php
				$page = "pages/".$_GET["id"].".php";
							
				if (!isset($_GET[id])){
					include("pages/homepage.php");
					}else{
						if(file_exists($page)){
							include($page);
						}else{
							echo "Strona nie została odnaleziona.";
						}
					}
			?>
1

Twój kod jest podatny na path traversal.

0
Patryk27 napisał(a):

Twój kod jest podatny na path traversal.

Dziękuję Ci bardzo za to ostrzeżenie, nawet o tym nie miałem pojęcia. Kiepsko by było, gdyby ktoś uzyskał dostęp do plików do których dostępu mieć nie powinien :P
Czy mogę prosić o jakąś inną i bezpieczną metodę?

1

Możesz podstrony ładować z bazy danych, w get będzie klucz na podstawie, którego wyciągniesz podstronę (klucz trzeba zabezpieczyć przed SQL Injection!).

Ewentualnie, nie używaj nazwy pliku bezpośrednio, tylko sprawdzaj to co masz w get instrukcją switch, i na tej podstawie ładuj pliki o hardcodowanych nazwach, tak samo jak z pages/homepage.php.

2
Spine napisał(a):

Ewentualnie, nie używaj nazwy pliku bezpośrednio, tylko sprawdzaj to co masz w get instrukcją switch, i na tej podstawie ładuj pliki o hardcodowanych nazwach, tak samo jak z pages/homepage.php.

Tylko nie drabinka case'ów :O

Najprościej zabezpieczyć się tworząc tablicę dozwolonych id, jeżeli to co przyjdzie w requescie jest w tablicy -> ładujesz plik (możesz nawet dzięki temu zmapować sobie id na nazwy plików, nie muszą być identyczne), a jak nie to 404. Kolejny plus jest taki, że możesz tą tablicę ładować z innego źródła.

$pages = [
'about' => 'pages/about.php',
'guzik' => 'pages/some-page.php'
// ...
];

I w zasadzie jedyne co musisz zmienić to swój warunek

// zamiast  if (!isset($_GET[id])){
if (!isset($pages[$_GET[id]])) {
0

Dziękuję wszystkim za zainteresowanie tematem. Miłego dnia życzę :)

1

albo ogarnąć mvc i ładować sobie widoki czy templaty wedle uznania

1 użytkowników online, w tym zalogowanych: 0, gości: 1