Minus tego typu rozwiązania polega na tym, że przy każdej nowej podstronie musisz dodać nowy warunek ręcznie. Inny, bardziej automatyczny sposób to ładowanie podanego w argumencie pliku. I tu rodzą się dwa sposoby, poprzez ID co wiąże się z korzystaniem np. z bazy, ale jest łatwiejsze w filtrowaniu, albo po nazwie pliku, co wiąże się z bardziej skrupulatną filtracją. Dla przykładu, bez dokładnej filtracji.
$_id = $_GET['id'];
if ( is_int($_id) )
{
$query = mysql_fetch_array(mysql_query('select plik from tabela where id = ' . $_id . ' limit 1'));
if ( $query !== false )
{
include '/' . $query['plik'] . '.php'; // albo echo/print w zależności co wrzucasz
}
}
// linki w postaci index.php?id=liczba - liczba to id pliku w bazie, niestety ten sposób wymaga generowania i zapisywania nazw plików z id do bazy co zresztą trudne nie jest w minimalistycznej wersji
$_name = $_GET['name'];
if ( $_name != '' )
{
include '/' . $query['name'] . '.php';
}
// linki w postaci index.php?name=nazwa_pliku
Tak jak pierwszy przykład zachowuje kompletne minimum bezpieczeństwa (przez wykorzystanie funkcji is_int będącej aliasem do is_integer i sprawdzającej czy podany parametr jest liczbą całkowitą), tak drugi jest otwarty na atak. Należałoby jakoś filtrować dane. Proponuję poczytać o funkcjach i metodach zabezpieczeń skryptów PHP (szykuję coś takiego na swoim blogu, w szerszym spojrzeniu ale pojawi się to dopiero za jakiś czas, na razie podstawy z podstaw masz
tutaj). Podam Ci kompletnie podstawowe przykłady zabezpieczeń.
W pierwszym przypadku parametr który przekazujemy z reguły musi być liczbą. Wystarczy więc zrzutować go na takowy typ, bądź odpowiednio na taki typ przefiltrować.
$_id = ( isset($_GET['id']) ? intval($_GET['id']) : 0 ); // lub (int)$_GET['id'] - sprawdzamy, czy został ustawiony element id, jeśli tak to filtrujemy go (w wypadku innego typu niż int zostanie przydzielone 0), jeśli nie to nadajemy 0
if ( $_id ) // sprawdzamy czy wartość jest inna niż 0
W drugim wypadku należałoby pobawić się przede wszystkim z usunięciem ciągów znaków jak
../ (pozwalających na przejście do katalogu powyżej), czy takich pozwalających na zastosowanie ataku XSS (np.
script,
alert,
document, itp.). Dobrze zastosować do określenia dozwolonej ścieżki do plików wyrażenia regularne (np. via
preg_match), a do
prostego wykluczania ciągów znaków
str_replace. Po za tym niezbędnym elementem w takich filtrowaniach są funkcje
htmlspecialchars (lub alternatywnie
htmlentities),
strip_tags i
mysql_real_escape_string (w zależności od kodowania w przypadku łączenia z bazą danych może być niekiedy też
addslashes). Użycie powyższych funkcji jest adekwatne do użycia
intval.
Ten krótki wykład porusza jeszcze raz powtórzę zupełnie podstawowe aspekty bezpieczeństwa i włączania innych plików w strukturę podstawowego. I oczywiście można to wszystko zrobić na wiele innych sposobów (często lepszych, ale to zależy od potrzeby). Nie bić
PS: nie ten dział chyba
Użytkownik Kai edytował ten post 03 09 2008 - 01:03