@codenerd på twitter Mit seneste tweet:

Skjul dine fejlbeskeder i PHP

Fejlbeskeder er utroligt hjælpsomme når man koder og laver en fejl, men de er også utroligt hjælpsomme til at afslører stier og specifikke fejl som kan udnyttes af hackere og andre godtfolk. Derfor er det en rigtig god ide at undlade at vise PHP fejl på servere som er offentlig tilgængelig, brugerne har intet at bruge dine PHP fejlbeskeder til, og når du skal bruge dem kan du jo altid slå dem til (se længere nede).

Mange webhosts er begyndt at slå fejlbeskeder fra som standard, og det synes jeg faktisk er en rigtig god ide – Unoeuro gør det dog ikke, så her må man selv tage affære.

Slå fejlbeskeder fra i php.ini

Hvis du har adgang til serverens og PHPs konfiguration er det smarteste helt klart at slå fejlbeskeder fra i php.ini, hvis du ikke ved hvor php.ini findes på serveren kan du finde configuration path ved at skrive echo phpinfo(); i php.

For at slå fejlbeskeder fra finder du følgende indstillinger og sætter dem til Off:

PHP
1
2
display_errors = Off
display_startup_errors = Off

Slå fejlbeskeder fra i .htaccess

Hvis du ikke har adgang til serveren, kan du i stedet slå fejlbeskederne fra med en .htaccess fil (Apache webserver), filen ligger du i roden af serveren og det er vigtigt filen hedder .htaccess uden nogen filendelse. Indholdet skal være:

PHP
1
2
php_value display_errors 0
php_value display_startup_errors 0

Slå fejlbeskeder fra i dit script

Har du ikke muligheden for nogen af ovenstående løsninger bør du altid gøre til vane at slå fejlbeskeder fra i alle dine scripts, evt. via en include fil som du includer alle steder. I et PHP script slår du fejlbeskeder fra ved at skrive følgende i toppen:

PHP
1
<?php ini_set('display_errors',0); ?>

Men denne løsning er ikke særligt holdbar idet parse errors stadig vil blive vist – dette skyldes at php parseren sender en parse error før dit php script og dermed ini_set overhovedet bliver kaldt. Derfor hvis du fx laver en:

PHP
1
2
3
4
5
6
7
8
<?php
ini_set('display_errors',0);
include ('test.asd');
$test = 'blah';
if ($test=='blah {
}
?>

Så vil du ikke få en advarsel fordi test.asd ikke findes, men du vil stadigvæk få vist en parse error for den manglende ) i den betingede sætning.

Slå fejlbeskeder til i PHP

Selvfølgelig kan man lave fejl når man koder – og så vil man jo gerne se fejlbeskederne, fordi ellers ender man med at kunne stirre sig blind på den manglende ; (semikolon) på linje 5132. Så for at vise fejlbeskeder i den enkelte side du arbejder på kan du altid bruge:

PHP
1
2
3
4
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
?>

Herefter vil du få vist fejlbeskeder på den enkelte side, bort set fra parse errors (hvis fejlbeskeder er slået fra i server konfiguration eller htaccess).

Hvis siden er offentlig tilgængelig kan det være en god ide at sætte et IP tjek på før du viser fejlbeskederne dette kan vi nemt lave med $_SERVER[‘REMOTE_ADDR’]:

PHP
1
2
3
4
5
6
<?php
if ($_SERVER['REMOTE_ADDR']=='din ip addresse') {
ini_set('display_errors',1);
error_reporting(E_ALL);
}
?>

Nogen vil måske sige du sagtens kan have ovenstående altid, men synes nu ikke det er en speciel god ide, sæt det ind, og udkommenter koden når du er færdig med at kigge på fejl.

Husk at hvis du midlertidigt skal have vist parse errors er du nødt til at gøre dette igennem .htaccess:

PHP
1
2
php_value display_errors 1
php_value error_reporting 4

Værdien 4 svarer til parse errors, du kan se alle værdier på php:error_reporting

Kommentarer/spørgsmål er som altid velkomne

10 kommentarer

  1. Det var et EKSTREMT lærerigt indlæg for en amatør-programmør som mig. Min fejlvisning var slået fra i kontrolpanelet i domæneadministrationen. Når jeg slog det til, var det globalt over hele siden – ikke så godt, for jeg har nogle andre sider samme sted. Men når jeg brugte det med ini_set, så bliver det som du skriver kun vist lokalt.

    Tak!

    Svar på kommentaren
  2. Skrevet af Martin  d. 15/01/2009 kl 10:04

    @Michael, glad for at høre det kan bruges, jeg kan forestille mig der kommer flere blog relaterede indlæg i den nærmeste fremtid.

    Jeg skal selv ha omkodet min blog på et tidspunkt, mest af alt for overskuelighedens skyld rent kodemæssigt, men den trænger også til en lille seo opdatering.

    Svar på kommentaren
  3. Skrevet af Morten  d. 15/01/2009 kl 22:27

    Lige så nyttige som de er for programmørere – lige så grimme er (intetsigende) fejlbeskeder for slutbrugerne.

    En anden ting er så, at hvis fejlbeskeden kan være relevant for brugerne, så er det bedre end en "det skette en uventet fejl"-besked.

    Men det er nogle rigtig gode tips – specielt det med IP-adressen.

    Svar på kommentaren
  4. Skrevet af Morten  d. 15/01/2009 kl 22:29

    Og når vi snakker om fejl, så får jeg en "Der opstod en fejl. Ret venligst fejlen (markeret med rød *)"-fejl, når jeg prøver at oprette en kommentar.

    Men når jeg kigger, så er min kommentar alligevel tilføjet.

    Svar på kommentaren
  5. Hej Martin
    Jeg faldt første gang over din blog for en del måneder siden da jeg undersøgte hvordan man lavede en ping funktion til at pinge forskellige RSS services og er nu vendt tilbage igen for at hapse din kode.

    Du skriver nogle lækre og utrolig detaljerede indlæg omkring webprogrammering som har givet mig inspiration til hvordan jeg skal sammensætte mine PHP scripts.
    Jeg er midt i processen af at omkode mit eget hjemmestrikkede blog system fra bunden for at optimere mine koder omkring sikkerheden og søgemaskineoptimering. Jeg har tænkt mig at bruge en del af dine indlæg til refferencer imens jeg sidder og koder, så mange tak for alle de herlige indlæg.

    Du får en million stjerner, ud af ti mulige, for dine lækre blog indlæg ^_^

    Svar på kommentaren
  6. Skrevet af Martin  d. 17/01/2009 kl 14:10

    I min verden er det aldrig bedre at vise en programmeringsmæssig fejl til en bruger, der er simpelthen for stor risiko i det. Noget helt andet er jo at man selvfølgelig skal skrive sigende fejlbeskeder ved validering og lign.

    Ang. fejlen her på siden kan jeg ikke genskabe den …. markerer den noget som den mener der skal udfyldes?

    Svar på kommentaren

Skriv en kommentar

Krævede felter er markeret med *.

*