Bekijk Volledige Versie : Re: Afbeelding van site halen met PHP?
Jeroen FF Heijmans schreef:
Allereerst: je stelt een server-side vraag - nl.internet.www.server-side
is een passender groep voor zo'n vraag. Groep toegevoegd en followup-to
derwaarts gezet.
> Ik lees dagelijks een paar strips (en wat tekst :)) van andere sites.
> Helaas lukt het me niet om deze los te bekijken.
>
Als ik het goed begrijp wil je die strips als plaatjes op je eigen site
hebben? Je weet dat dat niet netjes is en vaak niet toegestaan?
> Op 1.ff.fm zie je de strips die ik graag lees en op
> http://www.ffii.nl/?page=comic_index.inc zie je ze nog een keer, maar
> dan anders..
>
> De link 'GF' werkt perfect en eigenlijk wil ik de rest ook zo hebben.
>
Ok, is duidelijk.
> Ik dacht dat ik 'UF' klaar had, maar die werkt met een steeds
> veranderende code, zo ook een paar andere pagina's.
>
De webmasters van die sites zijn natuurlijk ook niet dom. Jij steelt hun
content (en bandbreedte) zonder dat zij er iets wijzer van worden (ik
neem tenminste aan dat je de waarschijnlijk aanwezige reclame niet gelijk
meeneemt :-)
> De links bij Kingfeatures (oa. SM) hebben een datum gerelateerde
> afbeelding die echter in het verleden ligt.
>
> Kan iemand mij vertellen hoe ik een pagina in kan lezen en deze
> vervolgens van zijn plaatje af te helpen (of beter gezegd, het plaatje
> over te nemen?).
>
In php? Dat spreek ik niet, maar even snel zoeken in het archief van
niws-s levert bijvoorbeeld de functie fopen op
<http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
wilt.
Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
(dynamische) bestandsnaam van het stripje distilleert (met regexps
bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
Location-header laten genereren. Lijkt mij het makkelijkste.
En om te voorkomen dat je voor elk stripje een apart scriptje moet
schrijven zou je zelfs kunnen overwegen om de plek van die dynamische
plaatjesbestandsnaam mee te geven als parameters. Of misschien niet de
plek maar informatie over *waar* die bestandsnaam precies staat.
Dus iets als
<img
src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
> En hoe je precies met PHP x dagen van de huidige datum moet aftrekken
> (ik kon wel het aantal seconden aftrekken, maar kwam niet meer terug
> op een normale datum).
>
Ah, dat lijkt me nu ook makkelijk te vinden op een van de php-
documentatiesites. En inderdaad, even zoeken op php.net levert je al
antwoorden op. Zie de 'User contributed notes' op
<http://nl2.php.net/manual/en/function.time.php>.
Groet,
Wimjan (advocaat van de duivel. En redelijk huichelachtig - ik had
vroeger ook zo'n rist stripjes op een privepagina staan. Wel zo
makkelijk)
--
Iemands e-mailadres kwijt? Probeer m'n meta e-mail zoeker eens op
<http://inventio.nl/metanamesearch/>
Jeroen FF Heijmans
17/07/03, 15:50
In nl.internet.www.ontwerp Wimjan <news@inventio.nl> wrote:
> Jeroen FF Heijmans schreef:
>
> Allereerst: je stelt een server-side vraag - nl.internet.www.server-side
> is een passender groep voor zo'n vraag. Groep toegevoegd en followup-to
> derwaarts gezet.
Oops...regeltje te hoog .. :(
>> Ik lees dagelijks een paar strips (en wat tekst :)) van andere sites.
>> Helaas lukt het me niet om deze los te bekijken.
>>
> Als ik het goed begrijp wil je die strips als plaatjes op je eigen site
> hebben? Je weet dat dat niet netjes is en vaak niet toegestaan?
Ach, ze gaan straks toch achter slot en grendel (for my eyes only :))
>> Kan iemand mij vertellen hoe ik een pagina in kan lezen en deze
>> vervolgens van zijn plaatje af te helpen (of beter gezegd, het plaatje
>> over te nemen?).
>>
> In php? Dat spreek ik niet, maar even snel zoeken in het archief van
> niws-s levert bijvoorbeeld de functie fopen op
> <http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
> wilt.
>
> Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
> (dynamische) bestandsnaam van het stripje distilleert (met regexps
> bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
> Location-header laten genereren. Lijkt mij het makkelijkste.
>
> En om te voorkomen dat je voor elk stripje een apart scriptje moet
> schrijven zou je zelfs kunnen overwegen om de plek van die dynamische
> plaatjesbestandsnaam mee te geven als parameters. Of misschien niet de
> plek maar informatie over *waar* die bestandsnaam precies staat.
>
> Dus iets als
>
> <img
> src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
> c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
Ik had al gezocht op php.net maar kwam er niet uit :(
>> En hoe je precies met PHP x dagen van de huidige datum moet aftrekken
>> (ik kon wel het aantal seconden aftrekken, maar kwam niet meer terug
>> op een normale datum).
>>
> Ah, dat lijkt me nu ook makkelijk te vinden op een van de php-
> documentatiesites. En inderdaad, even zoeken op php.net levert je al
> antwoorden op. Zie de 'User contributed notes' op
> <http://nl2.php.net/manual/en/function.time.php>.
Ik had al bij date en time gekeken, maar kon niet vinden hoe ik terug kon gaan van de
uitgerekende tijd in seconden vanaf 1970 naar datum.
Ik zal deze eens gaan bekijken:
echo date("Y-m-d",(time-24*3600)); denk ik zo...
John Bokma
17/07/03, 16:20
Wimjan wrote:
[snip]
> Dus iets als
>
> <img
> src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
> c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
Stel dat ik dat stukje HTML op mijn site zet, is Jeroen daar blij mee?
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
website design tips: http://johnbokma.com/websitedesign/ (preliminary)
Jeroen FF Heijmans
17/07/03, 16:50
John Bokma <postmaster@castleamber.com> wrote:
> Wimjan wrote:
>
> [snip]
>
>> Dus iets als
>>
>> <img
>> src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
>> c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
>
> Stel dat ik dat stukje HTML op mijn site zet, is Jeroen daar blij mee?
Dit stukje heb ik geen enkel probleem mee :)
Het komt op jouwserver uit *grin*
Maar jij doelt op het feit dat men dan mijn server kan belasten met het ophalen van images
denk ik?
Persoonlijk zou ik het eerder doen met een ECHO-statement zodat alleen het plaatje wordt
opgeroepen. Net zoals ik met GF gedaan heb.
Jeroen FF Heijmans
17/07/03, 17:35
In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
> Jeroen FF Heijmans schreef:
>
> In php? Dat spreek ik niet, maar even snel zoeken in het archief van
> niws-s levert bijvoorbeeld de functie fopen op
> <http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
> wilt.
>
> Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
> (dynamische) bestandsnaam van het stripje distilleert (met regexps
> bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
> Location-header laten genereren. Lijkt mij het makkelijkste.
Dit is nog heel erg veel voor mij...zal het eens doorlezen...
> En om te voorkomen dat je voor elk stripje een apart scriptje moet
> schrijven zou je zelfs kunnen overwegen om de plek van die dynamische
> plaatjesbestandsnaam mee te geven als parameters. Of misschien niet de
> plek maar informatie over *waar* die bestandsnaam precies staat.
>
> Dus iets als
>
> <img
> src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
> c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
Ik gebruikte eerst :
<?PHP
$ufiewaarde = ((round(date("U")/86400)) - 6503);
if ($ufiewaarde < 10000) {
$ufiewaarde = ('00' . $ufiewaarde);
} else {
$ufiewaarde = ('0' . $ufiewaarde);
}
echo ('<A HREF="http://www.userfriendly.org/static/" TARGET="_blank"><IMG
SRC="http://www.userfri
endly.org/cartoons/archives/' . date("y") . strtolower(date("M")) . '/xuf' . $ufiewaarde .
'.gif"
BORDER="0"></A>');
?>
Maar ik kwam er dus achter dat ze na een paar dagen weer een nieuwe serie nummers beginnen
:(
Maar als ik het goed begrijp zou ik dus alleen maar de code (hier $ufiewaarde) hoeven te
pakken uit de pagina
en hoef ik niet het hele url van het plaatje te zoeken. Toch?
Jeroen FF Heijmans schreef:
> In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
> > Jeroen FF Heijmans schreef:
>
> > In php? Dat spreek ik niet, maar even snel zoeken in het archief van
> > niws-s levert bijvoorbeeld de functie fopen op
> > <http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
> > wilt.
> >
> > Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
> > (dynamische) bestandsnaam van het stripje distilleert (met regexps
> > bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
> > Location-header laten genereren. Lijkt mij het makkelijkste.
>
> Dit is nog heel erg veel voor mij...zal het eens doorlezen...
>
Dit lijkt me echt de makkelijkste oplossing - per slot van rekening staat
de dynamische plaatjesbestandsnaam gegarandeerd op zeg
<http://www.userfriendly.org/static/>. Je haalt die pagina even op met
fopen('http://www.userfriendly.org/static/') (of zo) en zoekt naar de
string 'WIDTH="576" BORDER=0 SRC="[wat dan ook]"></A>' of zo. Vervolgens
print je de header "Location: [wat dan ook]" - volgens mij kan dat met
iets als 'header("Location: [wat dan ook]");'.
> Ik gebruikte eerst :
>
> <?PHP
> $ufiewaarde = ((round(date("U")/86400)) - 6503);
>
[...]
>
> Maar ik kwam er dus achter dat ze na een paar dagen weer een nieuwe serie
> nummers beginnen :(
>
En daarom lijkt het me praktischer om niet zelf te proberen die code te
onthaspelen maar gewoon te gebruiken wat je aangeboden wordt.
> Maar als ik het goed begrijp zou ik dus alleen maar de code (hier
> $ufiewaarde) hoeven te pakken uit de pagina en hoef ik niet het hele url
> van het plaatje te zoeken. Toch?
>
Geen idee, sorry.
Groet,
Wimjan
--
Iemands e-mailadres kwijt? Probeer m'n meta e-mail zoeker eens op
<http://inventio.nl/metanamesearch/>
John Bokma
17/07/03, 18:20
Jeroen FF Heijmans wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>
>>Wimjan wrote:
>>
>>[snip]
>>
>>
>>>Dus iets als
>>>
>>><img
>>>src="http://jouwserver/getcomic.php?url=http://www.userfriendly.org/stati
>>>c/&search=http://www.userfriendly.org/cartoons/archives/03jul/.*gif">
>>
>>Stel dat ik dat stukje HTML op mijn site zet, is Jeroen daar blij mee?
>
>
> Dit stukje heb ik geen enkel probleem mee :)
> Het komt op jouwserver uit *grin*
*via* jouw server...
> Maar jij doelt op het feit dat men dan mijn server kan belasten met het ophalen van images
> denk ik?
Yeah :-).
> Persoonlijk zou ik het eerder doen met een ECHO-statement zodat alleen het plaatje wordt
> opgeroepen. Net zoals ik met GF gedaan heb.
Kay. Ik las fopen en zo.
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
website design tips: http://johnbokma.com/websitedesign/ (preliminary)
Jeroen FF Heijmans
17/07/03, 20:50
Wimjan <news@inventio.nl> wrote:
> Jeroen FF Heijmans schreef:
>> In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
>> > Jeroen FF Heijmans schreef:
>>
>> > In php? Dat spreek ik niet, maar even snel zoeken in het archief van
>> > niws-s levert bijvoorbeeld de functie fopen op
>> > <http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
>> > wilt.
>> >
>> > Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
>> > (dynamische) bestandsnaam van het stripje distilleert (met regexps
>> > bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
>> > Location-header laten genereren. Lijkt mij het makkelijkste.
>>
>> Dit is nog heel erg veel voor mij...zal het eens doorlezen...
>>
> Dit lijkt me echt de makkelijkste oplossing - per slot van rekening staat
> de dynamische plaatjesbestandsnaam gegarandeerd op zeg
> <http://www.userfriendly.org/static/>. Je haalt die pagina even op met
> fopen('http://www.userfriendly.org/static/') (of zo) en zoekt naar de
> string 'WIDTH="576" BORDER=0 SRC="[wat dan ook]"></A>' of zo. Vervolgens
> print je de header "Location: [wat dan ook]" - volgens mij kan dat met
> iets als 'header("Location: [wat dan ook]");'.
Ik moet ff heel goed gaan kijken naar die dingen :(
Lijkt me nog pittig... toch bedankt voor de hints.
Daniel Tryba
17/07/03, 22:35
In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
>> Kan iemand mij vertellen hoe ik een pagina in kan lezen en deze
>> vervolgens van zijn plaatje af te helpen (of beter gezegd, het plaatje
>> over te nemen?).
>>
> In php? Dat spreek ik niet, maar even snel zoeken in het archief van
> niws-s levert bijvoorbeeld de functie fopen op
> <http://www.php.net/manual/en/function.fopen.php>. Doet precies wat je
> wilt.
Neen, dat is in enkele gevallen niet voldoende, oa vanwege refererer
checks en user-agent checks, fsockopen staat je toe om dit soort dingen
er netjes zelf bij te verzinnen.
> Als je nu eens de statische pagina van zo'n stripje ophaalt en daaruit de
> (dynamische) bestandsnaam van het stripje distilleert (met regexps
> bijvoorbeeld). Vervolgens kun je je php-scriptje denk ik wel een
> Location-header laten genereren. Lijkt mij het makkelijkste.
Op zich wel, en dat scheelt ook bandbreedte indien andere mensen je
"shortcuts" ontdekken.
> Wimjan (advocaat van de duivel. En redelijk huichelachtig - ik had
> vroeger ook zo'n rist stripjes op een privepagina staan. Wel zo
> makkelijk)
Ach, normaal gesproken indien het voor persoonlijk gebruik is zal men er
zich niet zo druk over maken, maar even vragen hoe en wat lijkt me wel
zo vriendelijk.... ooit heb ik bv een scriptje gehakt voor UF (in PHP
dus als je hints wilt hebben hoe je het plaatje dynamische ophaalt hoor
ik het wel (in de nieuwsgroep uiteraard)) om de laatste 3 dagen in een
handig formaat te kunnen bekijken op een ipaq/avantgo, kreeg ik na
hierover een vraagje (over wat ze er zelf van dachten, mijn caching en
eventueel openbaar maken) een link welke me veel werk zou hebben
gescheeld :)
--
Daniel Tryba
Warden Dave
18/07/03, 03:05
"Jeroen FF Heijmans" <news@nospam.ff.fm> wrote:
> Ik moet ff heel goed gaan kijken naar die dingen :(
> Lijkt me nog pittig... toch bedankt voor de hints.
Toch nog een iets practischer hint... Bijv.:
include_once("http.php");
$http = new HTTP;
$base = "http://www.userfriendly.org";
if ($http->read_URI("$base/static/") &&
preg_match("|/cartoons/\?id=(\d+).+?(<IMG.+?/cartoons/(.+?)\".*?>)|i",
$http->DATA, $r)) {
$img_src = "$base/cartoons/{$r[3]}";
//--------------------
echo htmlspecialchars( $r[2]) . "<br>\n"; // $r[2] = "<IMG ...>"
echo $img_src;
//--------------------
}
Zie: http://www.mnsys.org/temp/ff_jatten.php
Je kunt, zoals eerder opgemerkt, de UA bijv. doorsturen naar $img_src en bij
mislukking naar 'een' eigen plaatje.
Zie ook:
http://www.mnsys.org/temp/http.txt
http://www.mnsys.org/temp/uri.txt
(Wat 2 ruwe schetsen zijn waar ik nu e.e.a. uit heb geknipt, maar nog steeds
niet echt helemaal geknipt voor jou. 't Is net 'iets' te veel...) Maar goed,
wie weet geeft het hier en/of daar toch een idee.
groet,
WD
Jan Ehrhardt
18/07/03, 03:35
Warden Dave in nl.internet.www.server-side (Fri, 18 Jul 2003 02:50:18
+0200):
>Zie: http://www.mnsys.org/temp/ff_jatten.php
Enne /niwo/ dan?
Jan
--
Look, Ma. No tables - http://www.steenbergen-stichting.nl/enbio.html
Warden Dave
18/07/03, 03:35
"Jan Ehrhardt" <monitor@monitor.nl.X> wrote:
> Warden Dave:
> >Zie: http://www.mnsys.org/temp/ff_jatten.php
> Enne /niwo/ dan?
Ga toch weg... Ik ga in deze nieuwsgroep wonen. ;)
Maar in alle ernst, ik zet alles snel weer terug, maar ik 'moet' aan sommige
scripts wat regels toevoegen om 1 paar ellendelingen van het idee af te
helpen dat het normaal is de eigen naam etc. boven andermans werk te zetten
& vervolgens ter download aan te bieden.
groet,
WD
Jeroen FF Heijmans
18/07/03, 09:35
Warden Dave <w@d.pro> wrote:
> "Jeroen FF Heijmans" <news@nospam.ff.fm> wrote:
>
> include_once("http.php");
>
> $http = new HTTP;
> $base = "http://www.userfriendly.org";
>
> if ($http->read_URI("$base/static/") &&
> preg_match("|/cartoons/\?id=(\d+).+?(<IMG.+?/cartoons/(.+?)\".*?>)|i",
> $http->DATA, $r)) {
> $img_src = "$base/cartoons/{$r[3]}";
>
> //--------------------
> echo htmlspecialchars( $r[2]) . "<br>\n"; // $r[2] = "<IMG ...>"
> echo $img_src;
> //--------------------
> }
>
>
> Zie: http://www.mnsys.org/temp/ff_jatten.php
Hmmzzz...
Ik heb dat netjes gedaan (en ook je http.txt en uri.txt geripped :)) en krijg dan een mooi
blancoscherm, niet wat ik op je ff_jatten.php zie :(
Want het is precies wat ik zoek :)
Jeroen FF Heijmans
18/07/03, 09:50
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
> Warden Dave <w@d.pro> wrote:
>> "Jeroen FF Heijmans" <news@nospam.ff.fm> wrote:
>>
>> include_once("http.php");
>>
>> $http = new HTTP;
>> $base = "http://www.userfriendly.org";
>>
>> if ($http->read_URI("$base/static/") &&
>> preg_match("|/cartoons/\?id=(\d+).+?(<IMG.+?/cartoons/(.+?)\".*?>)|i",
>> $http->DATA, $r)) {
>> $img_src = "$base/cartoons/{$r[3]}";
>>
>> //--------------------
>> echo htmlspecialchars( $r[2]) . "<br>\n"; // $r[2] = "<IMG ...>"
>> echo $img_src;
>> //--------------------
>> }
>>
>>
>> Zie: http://www.mnsys.org/temp/ff_jatten.php
>
> Hmmzzz...
> Ik heb dat netjes gedaan (en ook je http.txt en uri.txt geripped :)) en krijg dan een mooi
> blancoscherm, niet wat ik op je ff_jatten.php zie :(
Het werkt, ik zal wel ergens een foutje gemaakt hebben.
http://www.ffii.nl/?page=comic_uf.inc is het resultaat, nu moet ik alleen nog ff gaan zoeken
waarom het zo lang moet duren. Ik vermoed doordat http.php en uri.php te groot zijn voor
mijn behoefte?
Jeroen FF Heijmans wrote:
> Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>> Warden Dave <w@d.pro> wrote:
>>> "Jeroen FF Heijmans" <news@nospam.ff.fm> wrote:
>>>
>>> include_once("http.php");
>>>
>>> $http = new HTTP;
>>> $base = "http://www.userfriendly.org";
>>>
>>> if ($http->read_URI("$base/static/") &&
>>> preg_match("|/cartoons/\?id=(\d+).+?(<IMG.+?/cartoons/(.+?)\".*?>)|i",
>>> $http->DATA, $r)) {
>>> $img_src = "$base/cartoons/{$r[3]}";
>>>
>>> //--------------------
>>> echo htmlspecialchars( $r[2]) . "<br>\n"; // $r[2] = "<IMG ...>"
>>> echo $img_src;
>>> //--------------------
>>> }
>>>
>>>
>>> Zie: http://www.mnsys.org/temp/ff_jatten.php
>>
>> Hmmzzz...
>> Ik heb dat netjes gedaan (en ook je http.txt en uri.txt geripped :)) en krijg dan een mooi
>> blancoscherm, niet wat ik op je ff_jatten.php zie :(
>
> Het werkt, ik zal wel ergens een foutje gemaakt hebben.
> http://www.ffii.nl/?page=comic_uf.inc is het resultaat, nu moet ik alleen nog ff gaan zoeken
> waarom het zo lang moet duren. Ik vermoed doordat http.php en uri.php te groot zijn voor
> mijn behoefte?
Even een waarschuwing: valideer je input! Zo is je systeem wel erg kwetsbaar!
http://www.ffii.nl/?page=/etc/passwd
http://www.ffii.nl/?page=http://www.google.com
Mark
Jeroen FF Heijmans
18/07/03, 12:05
Marcus <mark@ijbema.xs4all.nl> wrote:
> Even een waarschuwing: valideer je input! Zo is je systeem wel erg kwetsbaar!
> http://www.ffii.nl/?page=/etc/passwd
> http://www.ffii.nl/?page=http://www.google.com
Het volgende staat weer in mijn index.php.
Had perongeluk 'rm *' gedaan terwijl het 'rm *~'
moest zijn, dus heb dingen ff uit me browser cache geplukt. Was eventjes de './' vergeten
toe te voegen. (had al een ander draadje hierover geopend :), toch bedankt).
<?
// als er achter index.php staat ?<iets> dan wordt dat hier nagekeken met $<iets>
if ($page) {
if ($page == 'index.php') {
ECHO("Liever niet");
} else {
INCLUDE('./' . $page);
}
} else {
INCLUDE('start_index.inc');
}
?>
--
Grtz,
Jeroen "FF" Heijmans
Warden Dave
18/07/03, 13:35
"Jeroen FF Heijmans" <news@nospam.ff.fm> wrote:
> http://www.ffii.nl/?page=comic_uf.inc is het resultaat, nu moet ik alleen
> nog ff gaan zoeken waarom het zo lang moet duren. Ik vermoed doordat
> http.php en uri.php te groot zijn voor mijn behoefte?
In 'function read_EntityBody' wordt er lekker traag regel voor regel gelezen
m.b.v. fgets(). Het lezen zou sneller gaan als je bijv. m.b.v. fread() in
ene de gehele CONTENT_LENGTH-lange moot zou lezen, maar dat wil helaas niet
altijd lukken.
groet,
WD
Daniel Tryba
19/07/03, 01:05
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>> Even een waarschuwing: valideer je input! Zo is je systeem wel erg kwetsbaar!
>> http://www.ffii.nl/?page=/etc/passwd
>> http://www.ffii.nl/?page=http://www.google.com
>
> Het volgende staat weer in mijn index.php.
>
> <?
> // als er achter index.php staat ?<iets> dan wordt dat hier nagekeken met $<iets>
>
> if ($page) {
> if ($page == 'index.php') {
> ECHO("Liever niet");
> } else {
> INCLUDE('./' . $page);
> }
> } else {
> INCLUDE('start_index.inc');
> }
> ?>
Ik hoop dat je nog goed slaapt nadat iemand op het idee komt om de url
als
foo.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f% 2e%2e%2f%2e%2e%2fetc%2fpasswd
aan te roepen (voldoende %2e%2e%2f toevoegen indien nodig).
--
Daniel Tryba
Jeroen FF Heijmans
19/07/03, 13:20
Daniel Tryba <news_nl.internet.www.server-side@canopus.nl> wrote:
> Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>>> Even een waarschuwing: valideer je input! Zo is je systeem wel erg kwetsbaar!
>>> http://www.ffii.nl/?page=/etc/passwd
>>> http://www.ffii.nl/?page=http://www.google.com
>>
>> Het volgende staat weer in mijn index.php.
>>
>> <?
>> // als er achter index.php staat ?<iets> dan wordt dat hier nagekeken met $<iets>
>>
>> if ($page) {
>> if ($page == 'index.php') {
>> ECHO("Liever niet");
>> } else {
>> INCLUDE('./' . $page);
>> }
>> } else {
>> INCLUDE('start_index.inc');
>> }
>> ?>
>
> Ik hoop dat je nog goed slaapt nadat iemand op het idee komt om de url
> als
> foo.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f% 2e%2e%2f%2e%2e%2fetc%2fpasswd
> aan te roepen (voldoende %2e%2e%2f toevoegen indien nodig).
Ik denk dat dat niet zoveel zal uitmaken...
Ik zag na posten dat ik nog een stukje vergeten was namelijk en heb die meteen aangepast.
INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
../%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
Toch?
--
Grtz,
Jeroen "FF" Heijmans
Daniel Tryba
19/07/03, 13:50
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>> Ik hoop dat je nog goed slaapt nadat iemand op het idee komt om de url
>> als
>> foo.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f% 2e%2e%2f%2e%2e%2fetc%2fpasswd
>> aan te roepen (voldoende %2e%2e%2f toevoegen indien nodig).
>
> Ik denk dat dat niet zoveel zal uitmaken...
> Ik zag na posten dat ik nog een stukje vergeten was namelijk en heb die meteen aangepast.
>
> INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
>
> Toch?
Dat klopt, maar ik heb zelf ook de neiging om de bestanden die ik
include op '.inc' te laten eindigen (en die staan meestal in een 'inc'
directory in de document_root (wat ik ook al bij meerdere personen
gezien heb)). Er blijft dan ook een kans (is nu stukken kleiner)
dat deze bestanden worden geinclude. IMHO wat je mimimaal moet doen is
filteren (zodat via de url dus niet hoger de dir boom ingewandeld kan
worden). Maar nog beter is het whitelisten van bestanden dan wel
directories, realpath lijkt me daar zeer handig voor:
$real=realpath('./'.$page.'.inc');
if(strpos($real,'/var/www/foo/bar/includedir')===0)
{
include($real);
}
else
{
die("Don't fool with me, go away");
}
--
Daniel Tryba
John Bokma
19/07/03, 16:05
Jeroen FF Heijmans wrote:
[snip]
> INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
>
> Toch?
Laat $page alleen door als het alfanummerieke tekens bevat, en evt. een _.
../%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
vergeten :-(.
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
Jeroen FF Heijmans
19/07/03, 17:05
John Bokma <postmaster@castleamber.com> wrote:
> Jeroen FF Heijmans wrote:
>
> [snip]
>
>
>> INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
>> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
>>
>> Toch?
>
> Laat $page alleen door als het alfanummerieke tekens bevat, en evt. een _.
>
> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
>
> Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
> vergeten :-(.
Ik dacht dat iedereen die met PHP werkte dit soort 'problemen' had, of doe ik iets heel bijzonders ofzo?
--
Grtz,
Jeroen "FF" Heijmans
Jeroen FF Heijmans
19/07/03, 17:05
Daniel Tryba <news_nl.internet.www.server-side@canopus.nl> wrote:
> Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>>> Ik hoop dat je nog goed slaapt nadat iemand op het idee komt om de url
>>> als
>>> foo.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f% 2e%2e%2f%2e%2e%2fetc%2fpasswd
>>> aan te roepen (voldoende %2e%2e%2f toevoegen indien nodig).
>>
>> Ik denk dat dat niet zoveel zal uitmaken...
>> Ik zag na posten dat ik nog een stukje vergeten was namelijk en heb die meteen aangepast.
>>
>> INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
>> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
>>
>> Toch?
>
> Dat klopt, maar ik heb zelf ook de neiging om de bestanden die ik
> include op '.inc' te laten eindigen (en die staan meestal in een 'inc'
> directory in de document_root (wat ik ook al bij meerdere personen
> gezien heb)). Er blijft dan ook een kans (is nu stukken kleiner)
> dat deze bestanden worden geinclude. IMHO wat je mimimaal moet doen is
> filteren (zodat via de url dus niet hoger de dir boom ingewandeld kan
> worden). Maar nog beter is het whitelisten van bestanden dan wel
> directories, realpath lijkt me daar zeer handig voor:
>
> $real=realpath('./'.$page.'.inc');
> if(strpos($real,'/var/www/foo/bar/includedir')===0)
> {
> include($real);
> }
> else
> {
> die("Don't fool with me, go away");
> }
En aangezien natuurlijk iedereen op die manier werkt, zou je zelfs je bestanden niet op .inc moeten laten eindigen maar
op iets geks zoals .echtniet ofzo.
Als it een standaard probleem is, zou je toch verwachten dat er in PHP/apache of wat dan ook een standaard mogelijkheid
is om te zorgen dat men niet boven de opgegeven root-dir kan komen :(
--
Grtz,
Jeroen "FF" Heijmans
Daniel Tryba
19/07/03, 17:05
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
> Als it een standaard probleem is, zou je toch verwachten dat er in PHP/apache of wat dan ook een standaard mogelijkheid
> is om te zorgen dat men niet boven de opgegeven root-dir kan komen :(
Die is er ook: safe_mode
BTW doe eens iets aan je regel lengte.
--
Daniel Tryba
John Bokma
19/07/03, 17:35
Jeroen FF Heijmans wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>
>>Jeroen FF Heijmans wrote:
>>
>>[snip]
>>
>>
>>
>>>INCLUDE('./' . $page . '.inc'); staat er nu. En volgens mij kan
>>>./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd.inc niet gevonden worden :)
>>>
>>>Toch?
>>
>>Laat $page alleen door als het alfanummerieke tekens bevat, en evt. een _.
>>
>>./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
>>
>>Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
>>vergeten :-(.
>
>
> Ik dacht dat iedereen die met PHP werkte dit soort 'problemen' had,
Heel veel mensen hebben inderdaad de deur openstaan...
> of doe ik iets heel bijzonders ofzo?
Nee.
Maar ik begreep dat je een inc directory wilt, en een inc voor
gedichten. Je kan dan iets doen als:
als het begint met "gedichten/"
is het stukje na de / puur en volledig alfanummeriek?
ja -> include ("pad/gedichten/" . stukje . ".inc");
nee -> include ("waar denkt u mee bezig te zijn?");
anders is het puur en volledig alfanummeriek?
ja -> include ("pad/inc/" . parameter . ".inc");
nee -> include ("waar denkt u mee bezig te zijn?");
anders
include ("waar denkt u mee bezig te zijn?");
Weet overigens nog een mooi plaatje om naar te redirecten :-D.
Iemand die ik ken had een script om MP3 bestanden te streamen. En als
parameter kon je de bestandsnaam + pad opgeven (zo leek het). En
inderdaad, lolbroeken die dus /etc/passwd gingen meegeven. Die werden
verrast op een leuk plaatje :-D.
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
John Bokma
19/07/03, 17:35
Jeroen FF Heijmans wrote:
[snip]
> Als it een standaard probleem is, zou je toch verwachten dat
> er in PHP/apache of wat dan ook een standaard mogelijkheid
> is om te zorgen dat men niet boven de opgegeven root-dir kan komen :(
Die is er, programmeren :-) PHP heeft diverse string operaties en
reguliere expressies.
Overigens, je regels zijn *extreem* lang of ligt dat aan mij?
tip: kijk eens naar Thunderbird:
http://www.mozilla.org/projects/thunderbird/
Volgens sommigen de OE killer :-). (En daar sluit ik mij bij aan).
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
Jeroen FF Heijmans
19/07/03, 20:20
John Bokma <postmaster@castleamber.com> wrote:
> Jeroen FF Heijmans wrote:
>
> [snip]
>
>> Als it een standaard probleem is, zou je toch verwachten dat
>> er in PHP/apache of wat dan ook een standaard mogelijkheid
>> is om te zorgen dat men niet boven de opgegeven root-dir kan komen :(
>
> Die is er, programmeren :-) PHP heeft diverse string operaties en
> reguliere expressies.
>
> Overigens, je regels zijn *extreem* lang of ligt dat aan mij?
>
> tip: kijk eens naar Thunderbird:
>
> http://www.mozilla.org/projects/thunderbird/
>
> Volgens sommigen de OE killer :-). (En daar sluit ik mij bij aan).
Kijk eens goed in mijn headers :)
En ik snap niet waarom mijn regellengte zo lang blijft staan. Hij staat toch korter ingesteld.
Lijkt wel iets dat zo blijft bij gequote regels.
--
Grtz,
Jeroen "FF" Heijmans
John Bokma
19/07/03, 20:35
NNTP-Posting-Host: 172.24.8.16
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
X-Trace: news1.news.support.nl 1058639041 19112 172.24.8.16 (19 Jul 2003 18:24:01 GMT)
X-Complaints-To: abuse@news-service.com
NNTP-Posting-Date: Sat, 19 Jul 2003 18:24:01 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5b) Gecko/20030716 Thunderbird/0.1a
X-Accept-Language: en-us, en
In-Reply-To: <bfc21l$kdm$1@rammelbak.ff.fm>
Cache-Post-Path: halkan.kabelfoon.nl!unknown@kf-nawij-cb02-0007.dial.kabelfoon.nl
X-Cache: nntpcache 3.0.1 (see http://www.nntpcache.org/)
Cache-Post-Path: nf3!unknown@halkan.kabelfoon.nl
X-Cache: nntpcache 3.0.1+tl2 (see http://www.nntpcache.org/)
Xref: nl-news.euro.net nl.internet.www.server-side:30675
Jeroen FF Heijmans wrote:
[erg lange regels, heeeel erg lange regels]
> Kijk eens goed in mijn headers :)
tin :-). Thunderbird doet het ook onder GNU/Linux ;-).
> En ik snap niet waarom mijn regellengte zo lang blijft staan. Hij
> staat toch korter ingesteld. Lijkt wel iets dat zo blijft bij gequote
> regels.
Nee, ook je nieuwe regels zijn erg lang (even aangepast).
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
zwemvlies verzoekschrift ontwikkeling op maat
Jeroen FF Heijmans
19/07/03, 20:50
John Bokma <postmaster@castleamber.com> wrote:
> Jeroen FF Heijmans wrote:
>
> [erg lange regels, heeeel erg lange regels]
>
>> Kijk eens goed in mijn headers :)
>
> tin :-). Thunderbird doet het ook onder GNU/Linux ;-).
Kheb wel MozillaFirebird draaien ;)
Maar ik zit via SSH te werken op een linuxbak en heb geen zin in een
X-oplossing :(
>> En ik snap niet waarom mijn regellengte zo lang blijft staan. Hij
>> staat toch korter ingesteld. Lijkt wel iets dat zo blijft bij gequote
>> regels.
>
> Nee, ook je nieuwe regels zijn erg lang (even aangepast).
Ik kreeg al de tip om het met export COLUMNS=<lengte> te doen,
maar ik start meestel mijn rtin op vanuit TF :(
--
Grtz,
Jeroen "FF" Heijmans
Jeroen FF Heijmans wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>> Jeroen FF Heijmans wrote:
>>
>> [erg lange regels, heeeel erg lange regels]
>>
>>> Kijk eens goed in mijn headers :)
>>
>> tin :-). Thunderbird doet het ook onder GNU/Linux ;-).
>
> Kheb wel MozillaFirebird draaien ;)
> Maar ik zit via SSH te werken op een linuxbak en heb geen zin in een
> X-oplossing :(
Je kan ook slrn eens proberen :)
Mark
John Bokma
20/07/03, 00:50
Jeroen FF Heijmans wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>
>>Jeroen FF Heijmans wrote:
>>
>>[erg lange regels, heeeel erg lange regels]
>>
>>
>>>Kijk eens goed in mijn headers :)
>>
>>tin :-). Thunderbird doet het ook onder GNU/Linux ;-).
>
>
> Kheb wel MozillaFirebird draaien ;)
Ik ook sinds gisteren, na de prima evaluatie van Thunderbird. Stuk
minder log dan Mozilla, en gelijk een paar extensions geinstalleerd :-).
> Maar ik zit via SSH te werken op een linuxbak en heb geen zin in een
> X-oplossing :(
Kan via een tunnel :-). Maar inderdaad, het kan traag worden en zo.
> Ik kreeg al de tip om het met export COLUMNS=<lengte> te doen,
> maar ik start meestel mijn rtin op vanuit TF :(
Wat is TF?
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
zwemvlies verzoekschrift ontwikkeling op maat
Daniel Tryba
20/07/03, 12:05
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
>> Nee, ook je nieuwe regels zijn erg lang (even aangepast).
>
> Ik kreeg al de tip om het met export COLUMNS=<lengte> te doen,
> maar ik start meestel mijn rtin op vanuit TF :(
Heeft niets met tin te maken maar met je editor
bv voor vim:
default_editor_format=vim -c 'se tw=72' +%N %F
--
Daniel Tryba
Daniel Tryba
20/07/03, 12:05
John Bokma <postmaster@castleamber.com> wrote:
> Laat $page alleen door als het alfanummerieke tekens bevat, en evt. een _.
>
> ./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
>
> Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
> vergeten :-(.
Daar trapt PHP gelukkig niet in (althans een backspace of delete
leverden een whitespace op, een null niet geprobeerd).
--
Daniel Tryba
John Bokma
20/07/03, 18:05
Daniel Tryba wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>
>>Laat $page alleen door als het alfanummerieke tekens bevat, en evt. een _.
>>
>>./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
>>
>>Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
>>vergeten :-(.
>
>
> Daar trapt PHP gelukkig niet in (althans een backspace of delete
> leverden een whitespace op, een null niet geprobeerd).
Hoe weet je dan dat PHP er niet in trapt? Of staat dat in de
documentatie. Het had een leuke naam, en werd vaak gebruikt als exploit.
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
zwemvlies verzoekschrift ontwikkeling op maat
Jeroen FF Heijmans
21/07/03, 14:50
In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
>
>> Ik lees dagelijks een paar strips (en wat tekst :)) van andere sites.
>> Helaas lukt het me niet om deze los te bekijken.
>>
> Als ik het goed begrijp wil je die strips als plaatjes op je eigen site
> hebben? Je weet dat dat niet netjes is en vaak niet toegestaan?
>>
> De webmasters van die sites zijn natuurlijk ook niet dom. Jij steelt hun
> content (en bandbreedte) zonder dat zij er iets wijzer van worden (ik
> neem tenminste aan dat je de waarschijnlijk aanwezige reclame niet gelijk
> meeneemt :-)
>
>> De links bij Kingfeatures (oa. SM) hebben een datum gerelateerde
>> afbeelding die echter in het verleden ligt.
>>
Ik schaam mij heel erg diep..
Ik ga altijd naar de strips toe en sla de homepage over..
Moet je hier eens kijken :(http://www.kingfeatures.com/sales/kol.htm
Met PHP-voorbeelden en al...
Hoe lief :)
--
Grtz,
Jeroen "FF" Heijmans
Jeroen FF Heijmans
21/07/03, 16:20
Jeroen FF Heijmans <news@nospam.ff.fm> wrote:
> In nl.internet.www.server-side Wimjan <news@inventio.nl> wrote:
>>
>>> Ik lees dagelijks een paar strips (en wat tekst :)) van andere sites.
>>> Helaas lukt het me niet om deze los te bekijken.
>>>
>> Als ik het goed begrijp wil je die strips als plaatjes op je eigen site
>> hebben? Je weet dat dat niet netjes is en vaak niet toegestaan?
>>>
>> De webmasters van die sites zijn natuurlijk ook niet dom. Jij steelt hun
>> content (en bandbreedte) zonder dat zij er iets wijzer van worden (ik
>> neem tenminste aan dat je de waarschijnlijk aanwezige reclame niet gelijk
>> meeneemt :-)
>>
>>> De links bij Kingfeatures (oa. SM) hebben een datum gerelateerde
>>> afbeelding die echter in het verleden ligt.
>>>
>
> Ik schaam mij heel erg diep..
>
> Ik ga altijd naar de strips toe en sla de homepage over..
> Moet je hier eens kijken :(http://www.kingfeatures.com/sales/kol.htm
>
> Met PHP-voorbeelden en al...
>
> Hoe lief :)
*mopper* voor de betalende klant.
Ik heb ze eens gemaild hoe dat precies zat en kreeg netjes een berichtje terug dat dat voor
de betalende klanten is. Eind dit jaar gaan ze het ook voor particuliere abonnementen doen
:(
--
Grtz,
Jeroen "FF" Heijmans
Daniel Tryba
21/07/03, 22:05
John Bokma <postmaster@castleamber.com> wrote:
>>>./%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2 e%2fetc%2fpasswd%00.inc
>>>
>>>Kan wel eens nare gevolgen hebben... Er is zelfs een naam voor... hmmm,
>>>vergeten :-(.
>>
>>
>> Daar trapt PHP gelukkig niet in (althans een backspace of delete
>> leverden een whitespace op, een null niet geprobeerd).
>
> Hoe weet je dan dat PHP er niet in trapt? Of staat dat in de
> documentatie. Het had een leuke naam, en werd vaak gebruikt als exploit.
Uitproberen. De "speciale tekens" hebben geen speciale betekenis voor
PHP:
<?php
$str='/etc/passwd^@.inc'; //^@ is dus een \0
for($i=0;$i<strlen($str);$i++)
{
echo "char: ".$str{$i}." [".ord($str{$i})."]\n";
}
?>
heeft als output:
char: / [47]
char: e [101]
char: t [116]
char: c [99]
char: / [47]
char: p [112]
char: a [97]
char: s [115]
char: s [115]
char: w [119]
char: d [100]
char: [0]
char: . [46]
char: i [105]
char: n [110]
char: c [99]
Echter include ziet de \0 als einde van de string (lang leve C:
open("/etc/passwd", O_RDONLY|O_LARGEFILE) = 3)
Iets te vroeg gejuicht dus :)
--
Daniel Tryba
John Bokma
21/07/03, 22:35
Daniel Tryba wrote:
> Echter include ziet de \0 als einde van de string (lang leve C:
> open("/etc/passwd", O_RDONLY|O_LARGEFILE) = 3)
>
> Iets te vroeg gejuicht dus :)
Ja... er was een leuke naam voor, wil maar niet te binnen schieten.
Misschien ergens bij mijn antieke bookmarks.
John
--
email: mail(at)johnbokma.com (or reply) home: http://johnbokma.com/
UI design tips: http://johnbokma.com/websitedesign/ ~ ICQ 218175426
zwemvlies verzoekschrift ontwikkeling op maat