Posts Tagged ‘code’

Hoe met PHP de open_basedir map te omzeilen.

dinsdag, december 27th, 2011

open_basedir is een verouderde, niet volledig veilige configuratie optie om uitvoer van PHP script en toegang tot bestanden te beperken tot een bepaalde map. Echter is open_basedir niet volledig waterdicht omdat bepaalde features zoals de opgeslagen sessie’s in PHP buiten de open_basedir moeten werken.
Hier is hoe een PHP script toch bestanden uit een andere map kunt gebruiken. In een shared hosting omgeving waarin openbase_dir de enige beveiliging is, is dit dus als volgt te misbruiken.

ini_set("session.save_path", "/sessions/user2/");
putenv("TMPDIR=/sessions/user2/");
ini_set("session.save_path", "");
@session_start();

Mijn advies voor server administrators is om de webserver te “jailen”,
dit verkomt ook dat met andere scripttalen die onder de webserver process draaien misbruikt kunnen worden om hoster zijn server volledig te hacken.
Verder is het instellen van de juiste bestandspermissies belangrijk, het is ook belangrijk om het gebruik van symbolische bestands links uitschakelen.
Daarnaast kun je nog putenv en ini_set functies aan disabled_functions van php configuratie toevoegen om deze bekende manier van open_basedir restricties te misbruiken te blokkeren.

HTTP headers die je webapplicatie veiliger maken

maandag, november 15th, 2010

Een eenvoudige manier om je bezoeker te beschermen bij een geslaagde hack op je webapplicatie,
is door gebruik te maken van de nieuwe beveiligings features die nu in veel webbrowser komen.
Veel van deze features werken door speciale HTTP header opties te sturen. Een nuttige optie is bijvoorbeeld de X-FRAME-OPTIONS http header die aangeeft of een webpagina in een frame geladen mag worden.
Als je bijvoorbeeld wilt dat je PHP applicatie niet in een frame mag worden weergeven dan moet je dit voordat je html begint te versturen op die pagina de volgende regel opnemen.

header("X-FRAME-OPTIONS: DENY");

Een nog verder gaande beveilig optie is X-Content-Security-Policy HTTP header, die beperkt waar inhoud vandaan geladen mag worden.
Echter zijn er vrij weinig  webbrowser(chrome) die deze beveiligings feature al ondersteunen.
Als je bijvoorbeeld de volgende regel toevoegd mag inhoud (afbeeldingen, css, javascript bestanden enz.) alleen van hetzelfde domein komen.

header("X-Content-Security-Policy: allow 'self';");

d9ping headers in httpfox
Let wel op dat deze maatregelen slechts de impact van misbruikt beperken, als je een XSS probleem hebt is het echte probleem niet opgelost. Daarbij komt nog dat het voor een heleboel oudere webbrowser niet werkt. Maargoed, je bezoekers zouden ook geen Internet Explorer6 meer moeten gebruiken. Deze website heeft de beveiliging features in ieder geval wel al ingebouwd en IE6 gebruikers wordenwerden gewaarschuwd dat ze moesten upgraden naar een hogere versie van hun browser. Een manier om de Http headers te bekijken is door het programma Wireshark of bijv. de Firefox extensie’s als: HttpFox,  Live HTTP Headers of Firebug te gebruiken.
Het is ook nog mogelijk via HTTP headers de XSS(cross scripting) filter van Internet Explorer aan- en uit te zetten. Dit kan met:

header("X-XSS-Protection: 1; mode=block");

maar het is niet nodig deze header te gebruiken want de XSS filter staat standaard al aan.

Snelheid tellen in PHP vs SQL

woensdag, april 21st, 2010

php vs. sqlStel je wilt bent iets aan het tellen bij de ontwikkeling van je dynamische website.
Dan zijn er vaak twee manieren om dit te doen.

1. In PHP tellen bijvoorbeeld:

$numdownloads = mysql_num_rows(mysql_query("SELECT * FROM downloads));

2. in je SQL query tellen bijvoorbeeld:

$sqlnumdownloads =  mysql_fetch_array( mysql_query("SELECT COUNT(*) AS aantal FROM downloads) );
$numdownloads = mysql_fetch_result($sqlnumdownloads,0,'aantal');

Je kunt verwachten dat de 2e methode sneller is. Omdat niet eerst alle data opvraagt wordt en deze van de database server naar de webserver over gestuurt wordt. De netwerk verbinding vormt de grootste bottelneck. Maar wat als de database server en webserver dezelfde computer is? Dan is de ‘overdracht’ van de gegevens niet de bottleneck meer. Maar ook dan is het tellen in SQL vaak sneller dan in PHP. Dit omdat het PHP parser nog het probleem dat het een grotere bulk data moet verwerken omdat deze data niet door de simple SQL query geoptimaliseerd is. Sterker nog als je MyISAM voor opslag gebruikt zal het resultaat direct beschikbaar zijn omdat het al gedaan is door steeds het aantal verwijderen en toevoegen van records bij te houden. M.a.w. het loont qua performance het tellen in SQL te doen.

CodeGreen versie 1.5 uitgegeven

maandag, april 12th, 2010

codegreenNa veel dingen in het CodeGreen spel te veranderen is er dan nu een nieuwe release van het spel gekomen. Het is eigenlijk niet gebruikelijk voor een game veel release te doen. Dus met deze update zijn veel dingen veranderd waarmee ik gelijk een hele hoop problemen van 1.0.1 probeer op te lossen. Het is dus niet een uitbreiding van het spel maar verbetering van alle problemen. Ten eerste wordt de highscore nu niet meer in een Access database opgeslagen. De access database was vrij groot, ook al zat er geen highscores in.  Daarom heb ik besloten gebruik te maken van de SQLLite database, die als publiek domein gelicenseerd. Dat is goed, want het combineert beter met opensource spel. Nog een voordeel van SQLlite is dat het lichter in geheugen gebruik is en veel sneller dan access. Verder is het probleem dat de muziek stop als een effect geluidje speelt nu opgelost. Maar ik besloten hier niet DirectSound voor te gaan gebruiken om geluid gelijktijdig te kunnen afslepen. In plaats daarvan heb ik een oplossing bedacht om extra geluidje te laten afspelen via een tweede process. Het is een beetje slordig maar hier vermij ik dat DirectSound en dus directX nodig is. Het voordeel van vermijden van Managed DirectX DirectSound is dat de gebruiker niet mee lastig gevallen wordt dat het directX nodig heeft, want dat is zeker 100mb aan bibliotheken. Dat is ook niet noodzakelijk want het spel gebruikt voornamelijk alleen GDI+ en heeft voor het teken en geen complexe 3d modelen nodig. Daarnaast blijft er zonder directX de mogelijkheid om codegreen op Mono onder linux of mac te draaien. Verder heb ik nog het logo op het hoofdscherm transparant gemaakt. Daarvoor moest ook de manier waarop de tekst naar beneden viel herschreven worden. Maar datzelfde effect is nu ook aan het optie scherm toegevoegd. CodeGreen 1.5 is nu te downloaden
Vooral voor mensen die het spel nog niet kennen een aanrader, om te leren hoe hacking simplistische werkt.
update: ik heb 1.5.1 uitgeven omdat een belangrijk dll’tje voor highscoren te laden ontbrak in de 1.5.0 release.