Podstawy PHP i MySQL
Temat 16 - Zabezpieczenie skryptu współpracującego z bazż MySQL
Powrót do spisu tematów


W tym rozdziale:

  1. Połączenie z bazą na jak najniższym poziomie uprawnień
  2. Filtrowanie danych pochodzących z formularza
Po co zabezpieczażż

Gdy stworzymy użytkownikowi możliwość wprowadzania danych do bazy lub wyszukiwania danych według zadanego klucza, zawsze istnieje niebezpieczeństwo przesłania tak przygotowanego zapytania, które zniszczy dane lub wyżwietli użytkownikowi informacje, do których według naszych założeń nie powinien mieć prawa dostępu.
Kluczem do zabezpieczenia danych przechowywanych w bazie jest filtrowanie danych pochodzących od użytkownika oraz ograsniczenie użytkownika z odpowiednimi uprawnieniami. Oddzielnym szerokim zagadnieniem jest zabezpieczenie samego serwera MySQL oraz interpretera PHP.
Opisane poniżej sposoby nie wyczerpuję tematu zabezpieczeż skryptów wspóżpracujżcych z bazami danych.

óżczenie z bazż z najniższymi uprawnieniami

Warto przygotował kilka różnych kont do tej samej bazy z różnymi uprawnieniami.
Konto a - niech ma uprawnienia tylko SELECT
Konto b - uprawnienia SELECT i INSERT
Konto c - uprawnienia SELECT i DELETE
Konto d - uprawnienia SELECT i UPDATE
Konto e - uprawnien8ia SELECT, INSERT, DELETE i UPDATE.

Tak wiżc jeżeli zadaniem skryptu jest tylko wyżwietlenie zawartożci ksiżgi gożci, wystarczy, gdy pożżczy siż on z bazż wykorzystujżc konto "a". W tej sytuacji użytkownik nie przekaże w wartożciach zmiennych żadnego kodu, który mógżby zmieniż wartożci danych lub je skasoważ.

Podobnie w każdej innej sytuacji, jeżeli chcemy zezwoliż użytkownikowi dopisaż wartożci do bazy, wystarczy, jeżeli pożżczy się skrypt z bazż wykorzystując konto "b".

Filtrowanie danych pochodzących od użytkownika

Zasadniczo wszystkie dane, które trafiają do skryptu z zewnątrz, są narażone na modyfikację celem nieautoryzowanego dostępu do danych. Najłatwiej jest przesłać fragment kodu, jeżeli użytkownik ma do dyspozycji pole tekstowe. Należy jednak "brać pod lupę" wszystkie zmienne, które będą miały stycznośż z bazą. Mogą to być zmienne przechowywane w sesji, w plikach cookie, przesyżane z formularza nawet z pól typu radio lub checkbox. Wszystkie te zmienne mogą być modyfikowane i wykorzystane do ataku.

Pierwszym sposobem filtrowania jest dodanie znaku backsklash \ (znak dosżownożci) przed wszystkie znaki potencjalnie niebezpieczne (apostrof, cudzysłów) za pomocą funkcji addslashes();
Odebranie więc zmiennej "imie" pochodzącej z formularza wyglżdaż następująco:

if(!empty($_POST["tresc"])){$tresc=addslashes($_POST["tresc"]);$krok=trim($tresc);}else{$tresc=0;};

Tak więc wartożż zmiennej zostanie dopisana do bazy wraz ze znakami dosżowności. Aby pozbyż się znaków dosłowności, gdy chcemy wyświetlić wartość odczytaną z bazy, można zastosować odwrotną funkcją, usuwającą znaki dosłowności stripslashes();, np.:

$tresc=stripslashes($tresc);

Proszż do swojej ksiągi gości wpisać post o następującej treści:
<font color='red'>To jest wiadomożż
Jak zostanie wyświetlona księga gości po zapisaniu tej wiadomościż
Proszę sprawdzić zachowanie księgi przy wpisaniu różnych fragmentów kodu HTML.
Jak widać, pomysłowość złożliwego użytkownika ma duże pole do popisu.

Aby zabezpieczyć się przed wyżwietlaniem kodu wprowadzonego przez użytkownika, należy przed wyżwietleniem wartości zmiennej zastosować funkcję htmlspecialchars();

<żphp
$tresc_ksiegi=htmlspecialchars(tresc_ksiegi);
echo"$tresc_ksiegi";
ż>

Niejednokrotnie spodziewamy się, jakiego charakteru zmienne mogż byż podane przez użytkownika. Gdy użytkownik wprowadza login lub hasżo, możemy wymagaż od niego stosowania tylko liter alfabetu łacińskiego oraz cyfr. Użycie wszelkich innych znaków może być potraktowane jako błąd.
Możemy skorzystać z tak zwanych wyrażeń regularnych:

if (!ereg('^[a-zA-Z0-9]+$', $login))
{
   echo'Bżżd';
   exit();
};

W powyższym kodzie sprawdzamy, czy zmienna $login skżada się z znaków od a do z, lub A do Z lub 0 do 9. Jeżeli w zmiennej $login wystąpią inne znaki, warunek zostaje spełniony, wyżwietla siż odpowiedni komunikat i nastżpuje zatrzymanie wykonywania kolejnych fragmentów skryptu.

Proszę do swojej księgi gości wpisać post, którego treść będzie składała się z dwustu (lub wiżcej) znaków nie oddzielonych spacją. Jaki bżdzie efekt wyświetlenia księgi gości
Możemy zabezpieczyć się również przed taką ewentualnością korzystając z następującego fragmentu skryptu:

$nowatresc=explode(" ",$tresc);
$total=sizeof($nowatresc);
for($i=0; $total > $i; $i++)
{
   if(strlen($nowatresc[$i])>"30")
  {
      echo'Podażeż zbyt dżugi tekst';
      exit();
   }else{
      $weryfikacja="ok";
   };
};

O innych sposobach zabezpieczeń od strony skryptu PHP i konfiguracji serwera znajdziecie Państwo więscej informacji w kolejnej edycji szkolenia. Tutaj przedstawiono te najważniejsze, bez których trudno wyobraziż sobie działanie jakiejkolwiek witryny opartej o skrypty PHP i bazy danych.
 

Do zapamiżtania

  1. Jeżeli tworzysz interaktywnż witryną nigdy nie ufaj użytkownikowi. Wszystkie dane, które pochodzż od niego mogą stanowić niebezpieczeństwo dla danych przechowywanych w bazie.

 


Powrót do spisu tematów