2009-10-19 10 views
12

Mam witrynę w php, która ma include(), aby osadzić zawartość w szablonie. Strona do załadowania podana jest w parametrze get, dodaję ".php" na końcu parametru i dołączam tę stronę. Muszę wykonać pewne sprawdzenie bezpieczeństwa, aby uniknąć XSS lub innych rzeczy (nie wtrysku mysql, ponieważ nie mamy bazy danych). Oto, co wymyśliłem.

$page = $_GET['page']; 

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || 
    !strpos($page, '\\') || !strpos($page, '..')) { 
     //append ".php" to $page and include the page 

Czy jest coś, co mogę zrobić, aby dodatkowo oczyścić mój wkład?

+4

Nie sprawdzaj wyniku strpos() w ten sposób - zwróci zero, jeśli dopasowanie jest na początku ciągu znaków, co zostanie ocenione jako fałszywe –

+0

@Tom, rozwiązanie acceppted pozwala Ja też tego unikam, w każdym razie dzięki, zapamiętam twoją radę na przyszły kod. –

+0

Zobacz też: http://stackoverflow.com/a/15825812/59087 –

Odpowiedz

27
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

jest prawdopodobnie najszybszym sposobem dezynfekcji to będzie to brać niczego i upewnij się, że zawiera tylko litery, cyfry, podkreślenia ani kresek.

+1

nadal może atakować za pomocą kodu szesnastkowego: zobacz http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to- prevent-sql-injection/12202218 # 12202218, a także http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

oba łącza dotyczą mysql i to pytanie nie dotyczy wtrysku sql – NikkyD

3

Zdefiniuj jawną listę stron w kodzie źródłowym, a następnie użyj jej do sprawdzenia danych wejściowych. Tak, to więcej pracy, ale daje bardzo jasne, co jest dozwolone, a co nie. Na przykład:

$AVAILABLE_PAGES = array('home', 'news', ...); 
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1); 

$page = $_GET['page']; 
if (!$AVAILABLE_PAGES[$page]) { 
    header("HTTP/1.0 404 Not Found"); 
    die('Page not found.'); 
} 

include "pages/$page.php";