Lek?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dalando De Zuil

Dalando De Zuil

17/08/2010 13:10:27
Quote Anchor link
Ik heb nu mijn volgende blog met mysql bijna klaar, maar ik wil nog even bij jullie checken of jullie kansen zien om te hacken, en hoe ik het kan repareren.

dit is niet mijn hele code, alleen de code die het in de database stop en eruit haalt.

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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    if (empty($_POST['naam'])) {
        echo "Naam was leeg!";               // Naam is leeg
        
    } elseif (empty($_POST['bericht'])) {
        echo "Bericht was leeg!";          // Bericht was leeg
    
        } else {                              // Niks aan de hand!

    $naam = $_POST['naam']; // Wat=wat?
    $bericht = $_POST['bericht'];

    $naam = mysql_real_escape_string($naam);   // voor de veiligheid
    $bericht = mysql_real_escape_string($bericht); // met real_escape_string          

    // de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen

    $sql = "
        INSERT INTO blog
        (
            naam,
            bericht
        )
        VALUES
        (
            '"
.$naam."',
            '"
.$bericht."'
        )
    "
;
?>


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
<?php
$sql
= "
    SELECT
        naam,
        bericht
    FROM
        blog
    ORDER BY
        id DESC        
"
;

// Gaat iets fout
if(!$res = mysql_query($sql))
{

    trigger_error(mysql_error().'<br />In query: '.$sql); // foutmessage
}
elseif(mysql_num_rows($res) == 0)
{

    echo 'no messages yet'; // als de database leeg is
}
else
{
    // Nu gaat alles goed
    while($row = mysql_fetch_assoc($res))
    {

    echo "<div style='width:300px; border:1px solid black; text-align:left;'><br><b>Naam:</b>". htmlentities($row['naam']) ."<br/><b>Bericht:</b><br/><br>". htmlentities($row['bericht']) ."<br></div><br/>"; // de regels
    }
}

 mysql_close($db) ; // connectie sluiten
?>
 
PHP hulp

PHP hulp

24/02/2025 04:25:47
 
Pim -

Pim -

17/08/2010 13:21:28
Quote Anchor link
Nee, niet echt. Geen XSS en geen injection. Wel spam

Oh, wel is een mysql_error() weergeven levensgevaarlijk als er ergens toch injection mogelijk blijkt.
Gewijzigd op 17/08/2010 13:25:45 door Pim -
 
- SanThe -

- SanThe -

17/08/2010 13:26:38
Quote Anchor link
Gebruik dubbele quotes voor html en enkele voor php om je html valid te maken.
 
Hipska BE

Hipska BE

17/08/2010 13:27:46
Quote Anchor link
1) nooit sorteren op ID dat gat zowieso ooit mis. Je kan beter bij het opslaan de tijd met sql NOW() meegeven en dan kan je ook later nog tonen op welke datum het bericht geplaatst is geweest.

2) van je eerste stukje code is lijn 11 en 12 totaal overbodig. Verwerk die $_POST beter in lijn 14 en 15

3) Je toont bij een fout de query aan je bezoekers. Stel dat je bezoeker een hacker/scriptkiddie is, dan weet ie meteen een deel van je database schema. Toon een melding aan de bezoeker en stuur de effectieve fout door naar jezelf of plaats het in een log bestand.
 
- Mark -

- Mark -

17/08/2010 13:30:42
Quote Anchor link
Je hoeft geen variabelen over te schijven, dat is nergens voor nodig. Tevens zou ik de mysql_real_escape_string() pas zo laat mogelijk doen. De kans dat je hem dan vergeet is veel kleiner als je het jezelf op die manier aanleert.

Je formulier afhandeling is niet echt al te mooi om eerlijk te zijn.

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
<?php      

    // de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen
    
    $sql = "
        INSERT INTO blog
        (
            naam,
            bericht
        )
        VALUES
        (
            '"
.mysql_real_escape_string($_POST['naam'])."',
            '"
.mysql_real_escape_string($_POST['bericht'])."'
        )
    "
;
    
?>
 
Pim -

Pim -

17/08/2010 13:32:31
Quote Anchor link
@Hipska, wat kan er dan mis gaan met sorteren op ID. Een auto-increment is betrouwbaar toch?
 
Hipska BE

Hipska BE

17/08/2010 13:38:28
Quote Anchor link
Het auto-increment getal hoeft niet per se opeenvolgend zijn, en bij het terugplaatsen van backups zal je nog meer problemen zien ;) Berichten kunnen dus in een niet gewenste volgorde komen te staan.

Je zoekt er het forum of google maar eens over rond.
Gewijzigd op 17/08/2010 13:39:48 door Hipska BE
 
Niels K

Niels K

17/08/2010 15:06:40
Quote Anchor link
Verder moet je wat beter scripten, ik vind het onoverzichtelijk zo.

Kijk eens naar dit: Dat ziet er toch veel beter uit?

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
<?php

// Foutmeldingen bijhouden in een array
$aErrors = array( );

    // Kijken of de pagina zichzelf heeft aangeroepen
    if( $_SERVER['REQUEST_METHOD'] == 'POST' )
    {

        // Kijken of er een geldige naam is ingevoerd
        if( !preg_match( '#^[\w\d]+$#', $_POST['naam'] ) )
        {

            // Array vullen
            $aErrors[ ] = '...';
        }

        // Kijken of er een geldig bericht is ingevoerd
        if( empty( $_POST['bericht'] ) && strlen( $_POST['bericht'] ) < 10 )
        {

            // Array vullen
            $aErrors[ ] = '...';
        }

        
        // Kijken of er foutmeldingen zijn opgetreden, dit kan ook met count of sizeof
        if( empty( $aErrors ) )
        {

            // Query die uitgevoerd dient te worden
            $insertQuery =
            "
                INSERT INTO
                    blog
                (
                    blog_name,
                    blog_message,
                    user_id,
                    blog_date
                )
                VALUES
                (
                    '"
.mysql_real_escape_string( $_POST['naam'] ). "',
                    '"
.mysql_real_escape_string( $_POST['bericht'] ). "',
                    '"
.mysql_insert_id( ). "',
                    NOW()
                )
            "
;
            
                // Kijken of Query gelukt is
                if( !$result = mysql_query( $insertQuery ) )
                {

                    $aErrors[ ] = '..';
                }

                
                // Etc..
        }
    }
    
?>


Nog een paar dingen:

- Let op de naamgeving: Gebruik het liefst engels
- Overzichtelijker programmeren
- Meer documentatie
- Misschien gebruik maken van OOP?
- Misschien gebruik maken van MySQLi of PDO?
- Foutenafhandeling kan beter
- Formulier controles kunnen beter

En kijk eens naar de Query. Ik heb de veldnamen wat aangepast.. Het is niet alleen naam en bericht wat je moet opslaan. Nee veel meer.
 
Pim -

Pim -

17/08/2010 15:43:52
Quote Anchor link
Toch vind ik niet dat elke regel becommentarieerd (leuk woord trouwens ;) ) hoeft te worden.
 
Jordy nvt

Jordy nvt

17/08/2010 15:47:36
Quote Anchor link
Ik zet nooi { en } op een aparte regel, maar zet ze meteen achter de lus. Dus niet

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if ($lol=TRUE)
{

   voer iets uit
}
else
{
   doe dit
}
?>


Maar altijd dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if ($lol=TRUE){
   voer iets uit
}else{
   doe dit
}
?>
Gewijzigd op 17/08/2010 15:47:45 door Jordy nvt
 
Mark Beets

Mark Beets

17/08/2010 16:03:55
Quote Anchor link
Volgens mij kan ik met curl je tabel nog wel vol stoppen met zooi.
Volgens mij vangt REQUEST_METHOD dat toch niet af, heren?


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_SERVER['HTTP_REFERER']) )
 
- Mark -

- Mark -

17/08/2010 16:05:29
Quote Anchor link
@Niels De controle van het bericht klopt niet echt of wel? Dat moet toch OR zijn en niet AND.

En waar is mysql_insert_id( ) goed voor?

@Pim Persoonlijk heb ik dat liever wel, Al drijf ik het vaak te ver door ben ik bang.

@Jordy inspringen is persoons gebonden, De manier waar jij het op doet is veels te veel op elkaar geduwd. Nu moet ik wel zeggen dat ik nogal veel witregel gebruik in mijn scripts. Ik zorg er altijd voor dat het blokkerig uitziet zullen we maar zeggen. zodat je makkelijker kunt zien wat bij elkaar hoort en wat niet.

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
<?php

    if($voorwaarde){
    
    #| Commentaar.
    
        $resultaat = 'Er is aan de voorwaarde voldaan';
        
    }

    else{
    
    #| Commentaar.
    
        $resultaat = 'Helaas! Er wordt niet aan de voorwaarde voldaan.';
        
    }


?>
Gewijzigd op 17/08/2010 16:08:31 door - Mark -
 
Niels K

Niels K

17/08/2010 16:06:24
Quote Anchor link
Heb je gelijk in Mark. Was ik vergeten..

@pim..

Nee klopt

// Array vullen

Is natuurlijk overbodig.. Maar beter te veel documenteren dan te weinig..

"De controle van het bericht klopt niet echt of wel? Dat moet toch OR zijn en niet AND."

Jawel klopt wel. Empty laat een spatie ook door.. vandaar die controle met strlen
Gewijzigd op 17/08/2010 16:53:09 door Niels K
 



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.