Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Obsługa błędów
Forum PHP.pl > Forum > PHP
Fixus
Witam. Jak w temacie. W jaki sposób radzicie sobie z obsługą błędów? Wiadomo że komunikaty podające pełną ścieżkę do pliku może być niebezpieczne. Dlatego chciałbym poznać różne sposoby na radzenie sobie z tym problemem. Tak więc zapraszam do dyskusji.
grzegorzr
Ja stosuje wzorzec Strategia do obslugi bledow. Odpowiedz zalezy od rodzaju bledu i "trybu" uzytkownika tzn. co innego zobacze ja przy pisaniu nowych linijek kodu a co innego uzytkownik koncowy. Przydatne jest tutaj buforowanie contentu.
Mordoran
  1. <?php
  2. if(!isset($_GET['pcn_id'])) {
  3. echo 'Brak danych o PCN';
  4. exit();
  5. } else {
  6. $pcn_id_from_get=$_GET['pcn_id'];
  7. $query="SELECT user_login FROM PCN WHERE id = '$pcn_id_from_get'";
  8. if(!@$result = odbc_exec($dbc, $query)) {
  9. echo 'Probelm z polaczeniem z baza danych';
  10. exit();
  11. } else {
  12. odbc_fetch_row($result);
  13. $user_login_from_sql = odbc_result($result,'user_login');
  14. if ($user_login_from_sql == NULL) {
  15. echo 'Brak danchy o PCN';
  16. exit();
  17. }
  18. }
  19. }
  20. ?>

Przykladowy kod z obsluga bledow.
Jak nie chcesz zeby php wypluwalo szczegoly bledow przed "newralgicznymi" punktami w skrypcie dodaj @
Np.
@$result = odbc_exec($dbc, $query)
Jak jest tu małpa to php nie wyswiewtli zadnych bledow ze nie udalo sie zapytanie do bazy. I samemu trzeba zadbac o ten blad ;]
dlatego to w if'ie mam.
MMX3
tu chyba bardziej chodzi o
  1. <?php
  2. try{...}
  3. catch{...}
  4. ?>


ja np. w mam tablice w klasie $errors

gdzie dopisuje błędy.
potem przy wyświetlaniu strony uruchamiam metode show_errors();
która najpierw sprawdza
  1. <?php
  2. if(count($this->errors)>0) {
  3. ....
  4. }
  5. ?>

i wyświetla diva z błędami.
Fixus
@MMX3 a możesz pokazać trochę dokładniejszy przykład? I czy to pozwala na to niebezpieczne pokazywanie ścieżki użytkownikowi?

p.s. Chodzi mi o każdą metodę obsługi błędów:)
cinekz
Witam. Rozwinę troszeczkę wypowiedź użytkownika 'Mordoran'. Jak już wspomniał Mordoran, jeżeli nie chcesz ujrzeć błedu, który generuje interpreter PHP, to dajesz @ przed funkcją, bądź wywołaniem metody obiektu. Chcąc dodać własny komunikat ów błedu możesz zrobić w ten sposób:
  1. <?php
  2. $rConnection = @mysql_connect( 'localhost' , 'root' , '' ); //przykładowa funkcja
  3.  
  4. if( !$rConnection ) //warunek 'czy wystąpił błąd'
  5. {
  6. die( 'Wystąpił błąd MySQL: ' . mysql_error() ); //tutaj dowolna instrukcja, np: echo , die() , exit() , lub co tam chcesz
  7. }
  8. ?>
,
lub w ten:
  1. <?php
  2. $rConnection = @mysql_connect( 'localhost' , 'root' , '' ) //przykładowa funkcja
  3. or die( 'Wystąpił błąd MySQL: ' . mysql_error() ); //tutaj występuje wyrażenie or w przypadku błedu zostanie wywołana funkcja zdefiniowana po wyrażeniu. W tym przypadku die();
  4. }
  5. ?>
.

Myślę, że pomogłem.
Pozdrawiam
Fixus
Jakbyście mogli mi wyjaśnić jedną rzecz. Otóż załóżmy, że sobie usuniemy te niebezpieczne komunikaty, ale my chcemy wiedzieć co i gdzie się sypnęło...warto zrobić logi. Ale nie wiem czy dobrze to rozkminiłem. Czy najlepiej wrzucać to sobie do jakieś pliku: np error_log.txt i update`ować kiedy wystąpi błąd?
seaquest
@Mordoran, sposób z @ jest tragiczny (nawet nie wiem czemu to nie jest jeszcze deprecated).

Najlepsza obsługa błędów to oczywiście wyjątki. Jednak PHP jest na tyle "dobre", że nie wszystko rzuca wyjątkiem. W związku z tym masz 2 wyjścia: albo display_errors (lub jakoś tak) off i szukanie informacji o błędach w error.log (bo tam apache zapisuje wszystko) albo tam gdzie się da korzystanie z klas (PDO,SPL itp itd) łapanie wyjątków. To drugie ma tę wadę, że niektóre rzeczy trzeba będzie obudować w klasy samemu. Ale za to ma też dużą zaletę. Potężny debug backtrace.

A poza tym tak z ciekawości... Jakie znaczenie ma to, że ja będę wiedział, że aplikacja znajduje się w katalogu /home/user/public_html/... czy jakimkolwiek innym? Co mi to da?
Fixus
pokazywanie pełnej ścieżki do skyptów twojej aplikacji jest bardzo niebezpieczne. Daje to stanowczo za dużo informacji osobie które mogłabny przeprowadzić atak. Wie już gdzie ma czego i w jaki sposób szukać. Możesz to porównać do drzwi z kilkoma zamkami. Wywalanie takich komunikatów to tak jakbyś z części z tych zamków wogóle nie korzystał. A po drugi jest to nieestetyczne i nieładne smile.gif
seaquest
Fixus: nie wiem skąd masz takie informacje. Tak na prawdę co to za zabezpieczenie ukrycie ścieżek.

Jeżeli aplikacja jest napisana dobrze, to nawet znając ścieżki nie jesteś w stanie do niej włamać się przez WWW. Natomiast jeśli chodzi o atak na serwer, to tak czy siak, jeżeli osoba atakująca będzie miała roota, to będzie znała Twoje ścieżki i już.
Eqalizer
  1. <?php
  2. function error_msg($type, $msg, $file, $line)
  3. {
  4. print "Przepraszamy, ale wystąpił błąd.<br />\n";
  5. }
  6. set_error_handler("error_msg");
  7. ?>


i dalej w kodzie:

  1. <?php
  2. $conn = mysql_connect("localhost", "root", "") or trigger_error("Error", E_USER_WARNING);
  3. ?>

lub
  1. <?php
  2. $conn = mysql_connect("localhost", "root", "") or die();
  3. ?>


Lub aby błąd wyświetlany był tylko raz:
  1. <?php
  2. class ErrorHandler
  3. {
  4. static $err;
  5.  
  6. static function error_msg($type, $msg, $file, $line)
  7. {
  8. if (self::$err == null) {
  9. self::$err = true;
  10. print "Przepraszamy, ale wystąpił błąd związany z połączeniem do bazy danych.<br />\n";
  11. }
  12. }
  13. }
  14. function err_msg($type, $msg, $file, $line)
  15. {
  16. ErrorHandler::error_msg($type, $msg, $file, $line);
  17. }
  18. ?>
GrayHat
  1. <?php
  2. try {
  3. // kod, który może zwrócić wyjątek (Exception)
  4. } catch (Exception $e){
  5.  throw Exception ($e->getMessage());
  6. }
  7. ?>


Ten kod przekazuje wyjątek dalej.
Na ostatniej warstwie zbierasz wszystkie wyjątki i robisz z nimi co chcesz winksmiley.jpg
nemis
Ja posiadam swoją klasę która w zależności od treści błędu wypluwa ładnego htmla.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.