Index

Voorbeeld: een gastenboek

Iets in het gastenboek schrijven
Gastenboek uitgeschakeld omdat dit voor teveel netwerk- en serverbelasting zorgt. Spammer robots proberen kost wat kost iets in het gastenboek te schrijven (zelfs als het niet lukt blijven ze proberen)

Het is voldoende dat je een gastenboek hebt, of die wordt door gastenboek-spam overwoekerd. Manieren om gastenboek-spam te vermijden worden op de pagina vermeld.
Zelfs een nep-gastenboek zoals hier werd door spammers overwoekerd: deze pagina krijgt meer hits dan alle pagina's van de server samen!



DEFLNG a-z
GLOBAL htm AS INTEGER
GLOBAL zi() AS STRING *1
GLOBAL zp() AS STRING
DECLARE FUNCTION html$(a$)
DECLARE FUNCTION unescape$(a$, b$)

FUNCTION PBMAIN()
    OPEN "f:\xitami\cgi-src\esc.doc" FOR INPUT ACCESS READ SHARED AS #1
    FILESCAN #1, RECORDS TO htm
    SEEK #1, 1
    DIM zi(1 TO htm) AS GLOBAL STRING * 1, zp(1 TO htm) AS GLOBAL STRING
    FOR i = 1 TO htm
        LINE INPUT #1, a$
        zi(i) = LEFT$(a$, 1)
        zp(i) = MID$(a$, 2) + ";"
    NEXT i
    CLOSE #1

    OPEN ENVIRON$("CGI_STDIN") FOR BINARY ACCESS READ AS #1
    GET$ #1, LOF(1), a$: CLOSE #1
    naam$= html$(unescape$(a$, "naam"))
    email$ = unescape$(a$, "email")
    subject$ = html$(unescape$(a$, "subject"))
    remarks$ = html$(unescape$(a$, "remarks"))

    OPEN "f:\xitami\guestbook.txt" FOR APPEND AS #2
    PRINT #2, "<tr><th align=left>" DATE$  " - "  TIME$  "<th align=left>"  naam$;
    PRINT #2, "<th align=left><a href=mailto:"  email$  ">"  email$  "</a><th align=left>"  subject$
    PRINT #2, "<tr><th align=left colspan=4>"  remarks$ "<tr><th colspan=4><hr>
    CLOSE #2

    OPEN ENVIRON$("CGI_STDOUT") FOR OUTPUT AS #3
    PRINT #3, "<html><body>"
    PRINT #3, "<h3>Following information is recorded in the guestbook:</h3>"
    PRINT #3, "<table><tr><td align=right>Date and time<th align=left>"  DATE$  " - "  TIME$
    PRINT #3, "<tr><td align=right>Name<th align=left>"  naam$
    PRINT #3, "<tr><td align=right>E-mail<th align=left>"  email$
    PRINT #3, "<tr><td align=right>Subject<th align=left>"  subject$
    PRINT #3, "<tr valign=top><td align=right>Remarks<th align=left>"  remarks$
    PRINT #3, "</table><p><a href=http://server.idemdito.org/cgi-bin/readguest>Read the guestbook</a></body><html>"
END FUNCTION


FUNCTION html$ (c$) STATIC
    d$ = ""
    FOR i = 1 TO LEN(c$)
        b$ = MID$(c$, i, 1): j = ASC(b$)
        IF j = 10 THEN
            d$ = d$ + "<br>"
        ELSEIF j > 31 THEN                               
            IF j = 60 THEN
                b$ = "&lt;"
            ELSEIF j = 62 THEN 
                b$ = "&gt;"
            ELSEIF j = 38 THEN
                b$ = "&"
            ELSEIF j > 122 THEN
                FOR k = 1 TO htm
                    IF zi(k) = b$ THEN
                        b$ = zp(k)
                        EXIT FOR  
                   END IF         
                NEXT k            
            END IF                
            d$ = d$ + b$
        END IF
    NEXT i
    html$ = d$
END FUNCTION
FUNCTION unescape$(a$, key$) STATIC
    c$ = ""
    j = PARSECOUNT(a$, "&"): k = LEN(key$)
    FOR i = 1 TO j
        b$ = PARSE$(a$, "&", i)
        IF LEFT$(b$, k) = key$ THEN
            b$ = REMAIN$(l + 1, b$, "="): k = LEN(b$)
            REPLACE "+" WITH " " IN b$
            FOR j = 1 TO k
                d$ = MID$(b$, j, 1)
                IF d$ = "%" THEN
                    c$ = c$ + CHR$(VAL("&H" + MID$(b$, j + 1, 2)))
                    j = j + 2
                ELSE
                    c$ = c$ + d$
                END IF
            NEXT j
            unescape$ = c$
            EXIT FUNCTION
        END IF
    NEXT i
END FUNCTION
            


Het gastenboek lezen


FUNCTION PBMAIN()
    OPEN ENVIRON$("CGI_STDOUT") FOR OUTPUT AS #3
    PRINT #3, "<html><body><table width=100%>"
    PRINT #3, "<tr><td>Date and time<td>Name<td>e-mail<td>Subject


    OPEN "f:\xitami\guestbook.txt" FOR BINARY ACCESS READ AS #2
    GET$ #2, LOF(2), a$: CLOSE #2
    PRINT #3, a$  "</table></body></html>"
END FUNCTION
    

Je opdracht:


Een echte forum

Nadat je de kode voor een gastenboek hebt geschreven is het maar een kleine moeite om een forum te schrijven. Als voorbeeld gebruik ik mijn site over het Zeepreventorium in De Haan.
Wiki
De eerste stap was het aanmaken van gastenboek, en heel snel volgde een een wiki op iedere pagina, zodat iedereen extra commentaar op iedere pagina kon schrijven. De volledige wiki wordt aangeroepen (op het scherm van de browser getoont) door één enkele javascript statement. Als iemand een bijdrage schrijft, dan wordt de pagina automatisch bijgewerkt. In feite maak je van iedere pagina van je site een gastenboek.

Met deze korte instruktie maak ik van iedere pagina een wikipagina:

<script src=/logo/g.js></script> Het tonen van de wiki komt voor rekening van de javascript (logo/g.js).


document.write("<br clear=all><hr><center><font size=+2>Ecris tes remarques sur cette page même");
document.write(" -<strong>WIKI</strong>- Schrijf hier je opmerkingen over deze pagina</font>");
document.write("<form method=post action=http://zeepreventorium.org/cgi-bin/pwriteguest.exe id=ff><table>");
document.write("<tr><td align=right>Naam / Nom:<td bgcolor=red width=1><td><input type=text name=naam width=40 maxlength=40 size=20>");
document.write("<td>Als toegangskode geef je de drieletter-afkorting van het zeepreventorium marin in hoofdletters.");
document.write("<tr><td align=right>Kode / Code:<td bgcolor=red width=1><td><input type=text name=kode width=40 maxlength=40 size=20>");
document.write("<td>Comme code d'accès, introduis les trois initiales du zeepreventorium marin en majuscules.");
document.write("<tr valign=top><td align=right><strong>Text / Texte:<td bgcolor=red><td colspan=2><textarea name=tekst rows=8 cols=120>");
document.write("</textarea><tr><td><td><td colspan=2><input type=submit value=Send>");
document.write("<table><tr><td><strong>Pour entrer en contact avec d'anciens pensionaires, utilise plutot le");
document.write(" <a href='/cgi/preadguest.exe'>livre d'or</a>.<br>");
document.write("Om in contact te komen met anciens, gebruik liefst het <a href='/cgi-bin/preadguest.exe'>gastenboek</a>.</strong></table>");
document.write("<input type=hidden name=url id=ux></table></form></center>");

ff.ux.value = document.URL;

In plaats van javascript dat de pagina schrijft (document.write...) had je ook beroep kunnen doen op een server include indien je server dit toelaat. Met PHP (of ASP als het echt moet) kan je heel snel een server include voorzien. De meeste webservers ondersteunen standaard SSI (Server Side Include), een eenvoudige manier om snel hoofdingen, pagina-eindes en andere constante tekst aan te maken. Het voordeel van een "javascript include" is echter dat spammers-robots de (externe) javascript niet bekijken: spammers kunnen dus niet weten dat er een blog op iedere pagina voorkomt.

De laatste javascript instruktie is belangrijk: daarmee geef je aan de server door vanaf welke pagina de wiki aangeroepen werd, zodat het programma de juiste pagina kan wijzigen. Het wijzigen van de pagina beperkt zicht tot het invoegen van de bijdrage juist voor de

<script src=/logo/g.js></script>
Uiteindelijk het forum
Oorspronkelijk had de site een gratis forum (je kan er genoeg op het internet vinden). Het forum werd zo laagdrempelig mogelijk gemaakt, zodat het niet nodig was dat je je moest inschrijven om berichten te posten. Omdat het forum heelwat bezoekers had, werd het ook druk bezocht door spammers: na een paar maanden was het forum overwoekerd door spamberichten. Eigenlijk was het forum een MFA-gedoe (made for adsense): een forum enkel en alleen om Adwords van Google te presenteren (you get what you pay for), en voldeed het absoluut niet meer.
In een paar dagen heb ik dan maar een eigen forum aangemaakt. Hier kan u het forum in werking zien: forum zeepreventorium.

Bij de realisatie werd er gebruik gemaakt van templates voor de creatie van de pagina: iedere pagina bestaat uit een hoofding, een aantal repeterende inhoudsblokken met vaste vorm en een voetnoot (footer): dus drie templates voor één pagina.
Bij het tonen van een pagina wordt de hoofding ingelezen, de variabele elementen van de pagina ingevuld (bijvoorbeeld een titel). Dan wordt de inhoud template ingelezen en de variabele elementen ingevuld (deze stap werd herhaald tot alle inhoudsblokken verwerkt zijn). Iedere pagina sluit af met een footer, dat afkomstig is van een derde en laatste template.
Het forum bestaat uit drie soorten pagina's: de algemene inhoudspagina (hoofdonderwerpen), de board-pagina (lijst van discussies die bij een hoofdonderwerp hoort) en de thread-pagina (discussie over een onderwerp). Bij iedere soort pagina hoort een hoofding, een repeterend inhoudsblok en een footer. En natuurlijk een beetje adsense zodat ik minstens de electriciteit terug betaald krijg.

Index

Individuele landingspage bezoekers: