functie mysql_real_escape_string()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nancy Mozer

Nancy Mozer

08/12/2010 13:56:39
Quote Anchor link
Hoi Deskundigen

Ik wil mijn gastenboek beveiligen tegen database injecties.
Ik weet alleen niet zeker of ik het wel goed heb gedaan. Klopt dit zo, op de goeie plek? (ik laat een gedeelte van het script zien) Helemaal onderaan die escape functies.

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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
$melding
    = ""; // Variabele voor foutmeldingen
$tekst      = "";
$naam       = "";
$emailadres = "";
$website    = "";

// Formulier alleen verwerken als op de knop met de naam 'submit'
// EN de waarde 'Toevoegen' is geklikt:

if (isset($_POST['submit'])) {
    if ($_POST['submit'] == "Toevoegen") {
        $datum      = date("Y-m-d");
        $tijd       = date("H:i:s");
        $tekst      = $_POST['t'];
        $naam       = $_POST['n'];
        $emailadres = $_POST['e'];
        $website    = $_POST['w'];
        // HTML-tags verwijderen uit de tekst met strip_tags() en
        // pas DAARNA de tekst omzetten in HTML met htmlentities():

        $tekst = strip_tags($tekst);
        $tekst = addslashes($tekst);
        $tekst = htmlentities($tekst);
        // Het voorvoegsel "http://" verwijderen uit de URL van de website:
        $website = eregi_replace("^http://", "", $website);
        // Overige invoer omzetten in HTML-tekens, vooral voor
        // de naam, want voor een e-mailadres of URL hoeft dat niet:

        $naam       = htmlentities($naam);
        $emailadres = htmlentities($emailadres);
        $website    = htmlentities($website);

        // Alleen een tekst van minimaal 4 tekens
        // en maximaal 500 woorden toevoegen:

        define("MINIMUMAANTAL_TEKENS", 4);
        define("MAXIMUMAANTAL_WOORDEN", 500);
        $aantal_tekens  = strlen($tekst);
        $aantal_woorden = str_word_count($tekst);
        if (($aantal_tekens >= MINIMUMAANTAL_TEKENS) and ($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
            // MySQL-toevoegquery opstellen:
            $sql  = "INSERT INTO `gastenboek` ";
            $sql .= "(`bericht_id`, `datum`, `tijd`, `tekst`, `naam`, `email`, `website`) ";
            $sql .= "VALUES ";
            $sql .= "('', '$datum', '$tijd', '$tekst', '$naam', '$emailadres', '$website') ";
            $sql .= "; ";
            // Databaseverbinding openen en query uitvoeren:
            require_once('mysql_connect.inc.php');
            $verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die(mysql_error());
            mysql_select_db("*****") or die(mysql_error());
            $toegevoegd = mysql_query($sql) or die(mysql_error());
            mysql_close($verbinding);

            // Browser omleiden naar het gastenboek
            // als de bijdrage is toegevoegd:

            if ($toegevoegd) {
                header("Location: http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/gastenboek.php");
                exit;
            }
        }
else {
            // Foutmelding weergeven:
            if (!($aantal_tekens >= MINIMUMAANTAL_TEKENS)) {
                $melding .= "De tekst is te kort.";
            }

            if (!($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
                $melding .= "Uw tekst telt " . $aantal_woorden . "&nbsp;woorden. ";
                $melding .= "Kort de tekst in tot maximaal " . MAXIMUMAANTAL_WOORDEN . "&nbsp;woorden. ";
            }


else {
$tekst = mysql_real_escape_string(nl2br($tekst));
$naam = mysql_real_escape_string($naam);
$emailadres = mysql_real_escape_string($emailadres);
$website = mysql_real_escape_string($website);

}
        }

    }
}


// Een eventuele foutmelding opmaken als een alinea:
if (strlen(trim($melding)) > 1) {
    $melding = '<p class="w">' . $melding . "</p>\n";
}
Gewijzigd op 08/12/2010 13:58:08 door Nancy Mozer
 
PHP hulp

PHP hulp

04/12/2024 20:48:21
 

08/12/2010 15:28:24
Quote Anchor link
- Controleren of een formulier gepost is doe je met if($_SERVER['REQUEST_METHOD'] == 'POST')
- Checken wat de waarde van submit is heeft geen zin, aangezien die niet altijd mee gestuurd wordt.
- Datum en tijd horen in één veld in de database. Zie ook de datum en tijd functies van je database.
- Variabelen kopiëren is onzin.
- Strip_tags en htmlentities doe je pas over je data heen als je het uit de database haalt. Niet als je het erin stopt.
- NOOIT addslashes gebruiken, die vernielen je data.
- Eregi is oud. En dit kan ook met een gewone stringfunctie gedaan worden (waarom überhaupt?)
- Haakjes bij tekst lengte check zijn niet nodig. Zie ook operators, let ook op de verschillen tussen && en and.
- Backticks (`) horen niet in SQL thuis.
- SQL injections mogelijk, zie mysql_real_escape_string.
- Variabelen buiten quotes halen.
- Je zet het bericht id niet, dus die hoeft ook niet per se in de query.
- Gebruik geen die, bouw nette foutafhandeling in. Jij valt ook niet dood neer als je wat verkeerd doet.
- Toon nooit php en / of sql fouten aan de gebruiker, deze data kan misbruikt worden.
- Twee keer dezelfde check uitvoeren is niet correct. Denk logisch na. (Dit gaat over de tekst lengte.)
- Waarvoor dient de else?
 



Overzicht Reageren

 
 

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.