gastenboek beveiligen tegen vandalisme

Zojuist kom ik tot de ontdekking dat een of andere achterlijke kleuter mijn gastenboek naar de eeuwige jachtvelden heeft geholpen. Het is niet de eerste keer dat dit gebeurd. Mijn gastenboek bestaat uit een combinatie van PHP en XML en is afgeleid van [url=http://www.kirupa.com/web/xml_guestbook.htm]een voorbeeld[/url] op Kirupa.com

Konijn heeft me al geholpen met de suggestie dat ik het PHP bestand een andere naam moet geven, maar kennelijk is dat niet afdoende.
Bestaat er een manier om een doodeenvoudig gastenboekje te beveiligen voor dit soort vervelende acties?
Oja… ik ben een absolute n00b op het gebied van PHP en XML, haha. Maar ik leer graag.

[size=9:ae2696d38d](Vergeef mij mijn taalgebruik… ik ben gewoon teleurgesteld en kwaad).[/size:ae2696d38d]

Wat voor een dingen worden er dan geplaatst? Werd er geklooid met HTML codes, en dat daarom het gastenboek niet meer wil laden?

(je moet begrijpen dat het (voor mij) nog een beetje onduidelijk is hoe het probleem ontstaan is. wat er verzonden is, waar je gastenboekscript problemen mee heeft)

Ah, klopt ik gaf te weinig informatie.

Er stond in feite helemaal niets meer in het gastenboek. De XML-file was helemaal leeg. Nu weet ik dat als je een bepaalde PHP-code invult in het verzendformulier dat dit ervoor zorgt dat het XML formulier leeg gemaakt wordt.

Zou het ook met permissies te maken kunnen hebben? Ik heb geen idee. Inmiddels heb ik er weer een tekstje ingezet.

Probeer eens dingen als addstripslashes en stripslashes te doen op je velden met informatie.

Kun je niet met een MySQL databank werken? Op zich moet dat niet veel meer werk geven: het enige wat je moet doen is je xml file via php en mysql laten opstellen en dan doorgeven aan wat je 't ook doorgeeft (flash?) Op die manier heb je je data staan in je databank en kan er weinig gebeuren. Het ergste wat je dan zou moeten doen is de boodschap die voor problemen zorgt verwijderen, dan ben je je berichten niet kwijt

[quote:748bbaea30="Zout"]Probeer eens dingen als addstripslashes en stripslashes te doen op je velden met informatie.[/quote:748bbaea30]

Ik heb werkelijk geen idee waar je het over hebt…

[quote:ed45b0c8d8="MacBjorn"][quote:ed45b0c8d8="Zout"]Probeer eens dingen als addstripslashes en stripslashes te doen op je velden met informatie.[/quote:ed45b0c8d8]

Ik heb werkelijk geen idee waar je het over hebt…[/quote:ed45b0c8d8]

Voor het invoeren van de data in je xml file pas je de functie addslashes toe op de tekst dat je wil toevoegen. Ik vraag me wel of dit zal helpen aangezien dit enkel quotes zal dubbel quoten, het kan in ieder geval geen kwaad
Nog beter is htmlspecialchars ook toe te passen, dat zal < en > tags neutraliseren (het lijkt wel een geneesmiddel).

Meer info:
http://be.php.net/manual/nl/function.addslashes.php
http://be.php.net/manual/nl/function.htmlentities.php

Heb de php wat aangepast zodat het script alleen via de server aangeroepen kan worden :

[code:1:70b2e0e57a]
if ($_SERVER[‘REMOTE_ADDR’] == “hier het ip adres van de server”) {
$xmlString = $HTTP_RAW_POST_DATA;
if (is_null($xmlString)) {
print “No data was sent”;
}
else {
$file = fopen(“guestbook.xml”, “w+”) or die(“Can’t open XML file”);
if(!fwrite($file, $xmlString)){
print “Error writing to XML-file”;
}
print $xmlString.“n”;
fclose($file);
}
} else {
echo "Ga jij eens wat nuttigs doen " . $_SERVER[‘REMOTE_ADDR’] . “!!”;
}
[/code:1:70b2e0e57a]

Bij hier het ip adres van de server uiteraard het ip adres van de server…

Kaydie: ik ga het meteen toepassen! Vriendelijk bedankt!

edit/ het lijkt niet te werken met je script Kaydie. Er wordt geen bericht geschreven. Ik heb de oude php-code er weer ingezet.

[quote:56fe84d814="MacBjorn"]Kaydie: ik ga het meteen toepassen! Vriendelijk bedankt![/quote:56fe84d814]

Ja stop maar… want dat gaat niet werken: het scriptje is niet goed… sorry! :oops:

Deze werkt beter…

[code:1:56fe84d814]
if ($_SERVER[‘HTTP_REFERER’] == “hier het pad van de pagina die het php scriptje aanroept…”) {
$xmlString = $HTTP_RAW_POST_DATA;
if (is_null($xmlString)) {
print “No data was sent”;
}
else {
$file = fopen(“guestbook.xml”, “w+”) or die(“Can’t open XML file”);
if(!fwrite($file, $xmlString)){
print “Error writing to XML-file”;
}
print $xmlString.“n”;
fclose($file);
}
} else {
echo "Ga jij eens wat nuttigs doen " . $_SERVER[‘REMOTE_ADDR’] . “!!”;
}
[/code:1:56fe84d814]

In jou geval dus nu bovenin invullen: “http://www.bjornnelissen.nl/

Moet dit dan tussen de <?php en de afsluitende ?> worden geplakt, of moet ik die ook vervangen?

Tussen php tags plakken, anders is het geen php maar gewoon html...

Ik zou het anders doen, want een HTTP_REFERER header kan makkelijk gefaked worden, en nu iedereen (op dit forum) kan zien hoe het werkt en waar het staat is het al helemaal niet meer te vertrouwen. Kortom, gebruik een simpel wachtwoord als sleutel:

[code:1:0f4cca85e3]
<?php

$passphrase = ‘alleenikweetdit’;

// je url in Flash krijgt dit erachter: ?p=alleenikweetdit
if (isset($_GET[‘p’]) && $_GET[‘p’] == $passphrase) {
$xmlString = $HTTP_RAW_POST_DATA;
if (is_null($xmlString) || trim($xmlString) == ‘’) {
print “No data was sent”;
} else {
$file = fopen(“guestbook.xml”, “w+”) or die(“Can’t open XML file”);
if(!fwrite($file, $xmlString)){
print “Error writing to XML-file”;
}
print $xmlString.“n”;
fclose($file);
}
} else {
echo "Ga jij eens wat nuttigs doen " . $_SERVER[‘REMOTE_ADDR’] . “!!”;
}

?>

[/code:1:0f4cca85e3]

De manier waarop je $HTTP_RAW_POST_DATA in één keer als file wegschrijft heeft zondermeer een risico. Zonder degelijke beveiliging kan inderdaad iedereen je file legen of vervangen door eigen gastenboek entries…

Ben wel benieuwd wat ie gedaan heeft, dattie je gastenboek heb kunnen resetten, want als ik alle tekens invoer krijg ik geen gedoe.

[quote:4541a95a93]Ben wel benieuwd wat ie gedaan heeft, dattie je gastenboek heb kunnen resetten, want als ik alle tekens invoer krijg ik geen gedoe.[/quote:4541a95a93]

Zeer waarschijnlijk door de php file direct aan te roepen (als je die weet te achterhalen). Als je een lege HTTP_RAW_POST_DATA weet te versturen is het zo gefikst. Het heeft denk ik weinig met de Flash/XML interactie te maken, zolang de strings inderdaad juist ‘escaped’ worden voor XML.

Je kunt niet voorzichtig genoeg zijn met dergelijke scripts…

klopt Fab, dat is precies wat er gebeurd.

Je had het in de tweede of derde post over permissies :

Volgens mij is een chmod 644 genoeg…

6 eigenaar lezen + schrijven
4 groep alleen lezen
4 iedereen alleen lezen

Op die manier kan alleen via scripts op de eigen server de data weggeschreven worden en niet van buitenaf. In combinatie met de eerdere hints (je kan de check van mij en die van fab ook combineren) ;

[code:1:1187d7d78d]if (isset($_GET[‘p’]) && $_GET[‘p’] == $passphrase) && $_SERVER[‘HTTP_REFERER’] == “pad van script ZONDER ?p=alleenikweetdit”){ [/code:1:1187d7d78d]

denk ik dat je redelijk save zit…

En anders kunnen we er altijd nog een derde check met sessie variabelen, cryptografie, captcha en verificatie per email inbouwen…

toch… jongens… :stuck_out_tongue:

als jij zin hebt ;) het is nog veels te mooi weer joh :D

if (isset($_GET['weather']) && $_GET['temperature'] > 26) && $_SERVER['HTTP_REFERER'] == "girlfriend"){ goToTheBeach(); }

[quote:d6a01a9cac="fab"]Ik zou het anders doen, want een HTTP_REFERER header kan makkelijk gefaked worden, en nu iedereen (op dit forum) kan zien hoe het werkt en waar het staat is het al helemaal niet meer te vertrouwen. Kortom, gebruik een simpel wachtwoord als sleutel:

[code:1:d6a01a9cac]
<?php

$passphrase = ‘alleenikweetdit’;

// je url in Flash krijgt dit erachter: ?p=alleenikweetdit
if (isset($_GET[‘p’]) && $_GET[‘p’] == $passphrase) {
$xmlString = $HTTP_RAW_POST_DATA;
if (is_null($xmlString) || trim($xmlString) == ‘’) {
print “No data was sent”;
} else {
$file = fopen(“guestbook.xml”, “w+”) or die(“Can’t open XML file”);
if(!fwrite($file, $xmlString)){
print “Error writing to XML-file”;
}
print $xmlString.“n”;
fclose($file);
}
} else {
echo "Ga jij eens wat nuttigs doen " . $_SERVER[‘REMOTE_ADDR’] . “!!”;
}

?>

[/code:1:d6a01a9cac]

De manier waarop je $HTTP_RAW_POST_DATA in één keer als file wegschrijft heeft zondermeer een risico. Zonder degelijke beveiliging kan inderdaad iedereen je file legen of vervangen door eigen gastenboek entries…[/quote:d6a01a9cac]

Ik heb dit ook geprobeerd en het werkt :slight_smile:

Maar wat ik nu wil is, dat de data ondersteboven wordt opgeslagen. Oftewel ik wil de nieuwste XML entry helemaal aan het eind in de XML file hebben, en de laatste XML entry helemaal aan het begin. Zodat als ik in Flash de XML inlaad, de nieuwste bovenaan komen, en de oudste onderaan.