MySQL gastenboek + installer

Door Nils Kuijpers, 15 jaar geleden, 5.682x bekeken

Dit is een gastenboek script dat ik vandaag gemaakt heb, simpel maar effectief. Users kunnen eens per sessie posten en er is spam protectie dmv md5 hashes.

Tevens wordt input altijd gecontroleerd voordat het de database ingaat.

Er zit een installer script bij waardoor je zelf helemaal niets hoeft te doen qua mysql databases

Gesponsorde koppelingen

PHP script bestanden

  1. mysql-gastenboek-installer

 

Er zijn 10 reacties op 'Mysql gastenboek installer'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Lasse
Lasse
15 jaar geleden
 
0 +1 -0 -1
Je maakt gebruik van $_SERVER['PHP_SELF'], welke gevoelig is voor XXS. Niet doen dus!
Verder controleer je of het formulier is verstuurd d.m.v isset($_POST["submit"]). Tegenwoordig doen we dit m.b.v. $_SERVER['REQUEST_METHOD']. Ik ben ook niet zo gecharmeerd van je functies. Je gebruikt ze allemaal maar één keer, en ze zijn niet universeel inzetbaar. Een functie is alleen handig als je heel vaak stukken code moet uitvoeren, of als de code er in door veel verschillende applicaties gebruikt kunnen worden. Ik zie ook geen SQL-injection beveiliging en geen algemene XSS beveiliging (kijk naar de functies htmlentities, htmlspecialchars en mysql_real_escape_string).
Ook zitten er een paar rare kronkels in je script, die niet perse fouten veroorzaken, maar niet zo efficient zijn. BV:
Op regel 127 doe je dit:
if(check_hash() == true),
waarna je op regel 154 dit doet:
elseif(check_hash() == false).

Waarom niet gewoon een else. Als je twee keer check_hash() uitvoert kost dat je ook twee keer een query, wat behoorlijk wat tijd kost.

En last but not least: In je database model zie ik voor de tijd een VARCHAR :-O Hier zullen een heel antal mensen hier niet blij mee zijn! Misschien aanpassen naar een echt datumtype?

Uiteindelijk moet ik toch concluderen dat er al heel veel gastenboekenscripts zijn, en dat deze weinig toevoegd, en zelfs grote beveiligingslekken vertoont.
PHP Newbie
PHP Newbie
15 jaar geleden
 
0 +1 -0 -1
Spam beveiliging door middel van md5 hashes? Waarom zou je een md5 string maken van je bericht? Je kunt toch gewoon een UNIQUE op het veld "bericht" zetten?
Nils Kuijpers
Nils Kuijpers
15 jaar geleden
 
0 +1 -0 -1
Lasse:

Dat van die functies daar zit wat in, alle tekens die niet a-z of 0-9 zijn worden weg gehaald dus sql injection wordt lastig lijkt me zo.

PHP Newbie:

Ja, maar dan komen ze evengoed in de database terecht.
Lasse
Lasse
15 jaar geleden
 
0 +1 -0 -1
Quote:
Dat van die functies daar zit wat in, alle tekens die niet a-z of 0-9 zijn worden weg gehaald dus sql injection wordt lastig lijkt me zo.
Nu je het zegt, is dat inderdaad zo. Maar vind je het niet een beetje drastisch om alleen letters en cijfers toe te staan? Er bestaat ook nog zoiets als een punt, een vraagteken, uitroepteken oftewel leestekens, en accenten en dergelijke.
Quote:
Ja, maar dan komen ze evengoed in de database terecht.
Dat is niet zo, want als er een dubbel bericht wordt gedetecteerd in de database wordt de nieuwe niet geaccepteerd, en krijg je een foutmelding terug.

Vind je trouwens dat in de rest van mijn opmerkingen ook niets zit, of ga je dat veranderen?
Bas IJzelendoorn
Bas IJzelendoorn
15 jaar geleden
 
0 +1 -0 -1
mja ik heb het script niet getest ofzo met een kijkje vind ik het er wel goed uitzien alleen qua gebruiksgemak? Ik zag namelijk dat een bericht maar 1x mag word gebruikt. Betekend dat dan dat er maar 1 persoon is die in je gasten boek lol mag zeggen?
Douwe
Douwe
15 jaar geleden
 
0 +1 -0 -1
Ik ben het eens met Lasse, en:
Waarom kijk je steeds of het resultaat van mysql_query() 1 is? mysql_query() geeft een resource terug, geen integer.
En waarom de query in een string zetten, als je hem niet gebruikt om bijvoorbeeld te loggen?
En van
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $num = mysql_num_rows($result);
    
    //Als er resultaten zijn    
    if($num > 0)
        {
        //Return false
        return false;
        }
    
    //Als er geen resultaten zijn
    else
        {
        //Return true
        return true;
        }

kun je net zo goed het volgende maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
return (mysql_num_rows($result) > 0);
Frank -
Frank -
15 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?
$result
= mysql_query($sql);
    
    //Echot een eventuele mysql error    
    echo mysql_error();
    
    //Zet het aantal resultaten in $num
    $num = mysql_num_rows($result);
?>

En waar is de foutafhandeling? mysql_num_rows() levert een dikke error op wanneer de query is mislukt en de echo mysql_error() gaat je daar ook echt niet bij helpen. Tuurlijk, dat helpt bij het debuggen, maar om dan nóg maar een error te veroorzaken, dat lijkt mij wat overdreven.

Op diverse plaatsen haal je dit geintje uit, dit script is dus nog niet voor de helft klaar, het belangrijkste onderdeel ontbreekt nog. Foutafhandeling en beveiling, wat eveneens ontbreekt.

`bericht` VARCHAR( 50 ) NOT NULL ,
`md5` VARCHAR( 250 ) NOT NULL ,

Een bericht mag maar 50 karakters lang zijn? En een md5-hash die onmogelijk langer (of korter) kan zijn dan 32 karakters, mag van jou 250 karakters lang worden? Dan maak je wel hele bijzondere md5-hashes aan...

En vergeet niet te controleren of een bericht niet langer is dan maximale lengte, MySQL knipt het restant er gewoon vanaf en jij bent een deel van je data kwijt. Maar goed, daar kies je voor wanneer je met een dataramp gaat werken. Sterkte!
Nils Kuijpers
Nils Kuijpers
15 jaar geleden
 
0 +1 -0 -1
ipv if(isset($_POST["submit"])) dan if($_SERVER['REQUEST_METHOD']=="POST") of hoe pas ik het precies toe?

Bericht lengte was idd fout , zo ook md5. aangepast.
Douwe
Douwe
15 jaar geleden
 
0 +1 -0 -1
Uhm... Gewoon if(isset($_POST["submit"])) vervangen door if($_SERVER['REQUEST_METHOD']=="POST") ?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Nick Nurmodeluxe
Nick Nurmodeluxe
14 jaar geleden
 
0 +1 -0 -1
ik ben niet zo'n expert in php, maar hoe kan je zorgen dat een gebruiker meerdere keren kan posten???

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. mysql-gastenboek-installer

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.