PHP i bezpieczeństwo

PHP operuje na plikach, bazach danych i formularzach HTML, oczywiście jest to jego wielka zaleta, ale trzeba pamiętać, że wielkie możliwości niosą ze sobą wielką odpowiedzialność. Wiedzieli o tym wszyscy superbohaterowie :). Jeśli nie zabezpieczymy odpowiednio Naszego kodu, to złośliwy użytkownik może mieć dostęp do wszystkich informacji z naszej bazy, a przy ekstremalnych przypadkach możemy stracić naszą całą bazę. Dlatego najważniejszą sprawą jest robienie kopi zapasowych przynajmniej w dwóch egzemplarzach, ale nie o tym chcę pisać.

Przy pisaniu tego artykułu korzystałem z książki "PHP i MYSQL - Projekty do wykorzystania". Kod zaprezentowany poniżej pobrałem także z tej książki.

<html>
<?php
if(isset($_POST['submited']))
{ echo '<p>Witaj, '.htmlspecialchars($POST['name']) .'</p>';}
else{
?>
<form action="<? echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" metchod="post">
<div>
Podaj imię: <input type="text" name="name"/>
<input type="submit" value="Zapisz"/>
<input type="hidden" neme="submitted" value="true" />
</div>
</form>
<?php
}
?>
</html>

W tak zapisanym kodzie zastosowaliśmy funkcję htmlspecialchars($_SERVER['PHP_SELF']), dzięki której zlikwidowaliśmy wszelkie znaki specjalne i znaczniki. Dzięki takiemu podejściu nikt nie wpiszę zamiast "imienia" kodu, który mógłby wykraść cenne informacje. Można równie dobrze zastosować funkcji Htmlentitlies() i strip_tags(). Ważne, żeby uważać na wszystkie pola tekstowe, które obsługuje kod PHP.

Nigdy nie wstawiaj pola tekstowego, które ma być częścią zapytania SQL. A jeśli już musisz to użyj funkcji (dla MySql) mysql_escape_string(). O to przykład:

$query = 'DELETE FROM Nasza_baza WHERE CZAS < "'.$_POST['date'].'"';

Wpisując w formularz coś takiego (2008-12-20" OR 1=1 --) Dopisujemy do naszego zapytania warunek, który zawsze jest spełniony. Takim sposobem skasujemy wszystkie rekordy. Jest to tak zwane wstrzykiwanie kodu. Oczywiście jest to ekstremalny przypadek, ale mogłoby się to zdarzyć.

To samo tyczy się do wszystkich pól tekstowych (najlepiej nie używaj ich jeśli nie musisz), zawsze patrz, gdzie takie pole może zostać wykorzystane i zawsze twórz kopię zapasową. Ponieważ człowiek jest tylko człowiekiem i nie możesz wychwycić wszystkich swoich błędów.