Hoe beveilig je querys ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Altin

Altin

03/11/2006 21:07:00
Quote Anchor link
Hoi
ik ben aan dus nog steeds aan een klein cms'je bezig, maar heb van iemand te horen gekregen, dat zo'n querys niet veilig zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php if(isset($_GET['bandid'])) {
    $bandid = $_GET['bandid'];
    $lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
    echo "<ul>";
        while ($lyrics = mysql_fetch_array($lyricslist)) {
        $lyricsTitle = $lyrics["lyricsTitle"];
        $lyricsID = $lyrics["id"];
        echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
    }

    echo "</ul>";
}

?>

Nu zou ik liever hebben dat mijn site niet dagelijks wordt gehackt. Dus zou iemand mij kunnen zeggen hoe ik querys beveilig ?
Ik ben nog maar een beginner, dus de makkelijkste weg, krijgt de voorkeur :p
Bij voorbaat dank!
 
PHP hulp

PHP hulp

05/11/2024 15:42:48
 
Frank -

Frank -

03/11/2006 21:14:00
Quote Anchor link
Wat is $_GET['bandid'] ? Is dit nummeriek? Controleer dat dan met is_nummeric() of ctype_digit(). Verder laat je altijd mysql_real_escape_string() los op de user-input, dan is SQL-injection onmogelijk.

Waarom controleer je niet of de query is gelukt? Die kan namelijk altijd mislukken en zal vroeg of laat ook mislukken. Check dus of $lyricslist TRUE of FALSE is, dan weet je of de query is gelukt of juist is mislukt.

Dan wat anders, namen als $lyricslist en $lyrics hebben niet mijn voorkeur. Dit betreffen namelijk een result-set en een row uit de result-set. $result en $row liggen volgens mij dan voor de hand. Zorg er in elk geval voor dat je een bewuste keuze maakt die op al jouw scripts wordt toegepast, ook als het niet gaat om lyrics.
 
Altin

Altin

03/11/2006 21:23:00
Quote Anchor link
@Frank:
Bedankt voor het antwoorden.
Ik veronderstel dat ik die is_nummeric zo moet gebruiken ?
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
<?php
if(isset($_GET['bandid'])) {
    $bandid = $_GET['bandid'];
    if (is_numeric($bandid)){
        $lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
        echo "<ul>";
            while ($lyrics = mysql_fetch_array($lyricslist)) {
            $lyricsTitle = $lyrics["lyricsTitle"];
            $lyricsID = $lyrics["id"];
            echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
            }

        echo "</ul>";
    }
else {
        echo "Invalid Band!";
    }
}

?>


Ik snap niet wat je bedoelt met mysql_real_escape_string() .
Ik weet ook niet hoe te kijken of ^lyricslist TRUE of FALSE is.
Zou je hiervan een voorbeeld willen geven ?
Wat de namen betreft, heb ik er niet echt bij nagedacht (van de vars). IK heb ze gewoon zo genoemd om ze te kunnen herkennen.
Bij voorbaat dank!
Gewijzigd op 01/01/1970 01:00:00 door Altin
 
Frank -

Frank -

03/11/2006 21:43:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
// eerste deel van je code, en dan:
if($lyricslist){ // TRUE, query is gelukt
  // zet de output op het scherm, zie je huidige code

}
else { // FALSE
  echo 'Mislukt vanwege de volgende fout: '.mysql_error();
}

?>

Met mysql_real_escape_string() voorkom je dat er ongewenste quotes e.d. in de query terecht kunnen komen. Deze kunnen als SQL-injection bedoelt zijn, maar ook de query laten mislukken. Zie verder de php-handleiding.

En niet nadenken over de namen voor de variabelen? Dat gaat vroeg of laat problemen opleveren, hier een paar voorbeelden:
$sVoornaam: string waar een voornaam in staat
$aVoornaam: array waar voornamen in staan
$iHuisnummer: integer wat een huisnummer voorstelt
$query: stuk SQL
$result: resultaat van een query
$row: rij uit het resultaat van een query

Met de s, a en i geef je dus ook aan van welk type de data is. Een string, array of integer. Er zijn nog meer types, dat mag je zelf uitzoeken.
 
Altin

Altin

03/11/2006 23:35:00
Quote Anchor link
ah ok
bedankt voor de les :)
Gewijzigd op 01/01/1970 01:00:00 door Altin
 
Altin

Altin

04/11/2006 10:25:00
Quote Anchor link
Zou iemand toch een voorbeeld kunnen geven van mysql_real_escape_string ?
I snap hier maar weinig van :$ http://be2.php.net/mysql_real_escape_string
 
Martijn B

Martijn B

04/11/2006 10:31:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?

$id
= 423432;

$sQuery = 'SELECT * FROM tabel WHERE id = \'' . mysql_real_escape_string($id) . '\'';

?>


Voor mysql_real_escape_string heb je dus wel een verbinding nodig met de database, anders zal deze functie een E_WARNING error genereren.
 
Robert Deiman

Robert Deiman

04/11/2006 10:36:00
Quote Anchor link
Martijn, waarom doe je de query niet zo: (het is uiteraard maar net wat je prettiger vind werken, maar ik heb het niet zo op escape tekens)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?

$id
= 423432;

$sQuery = "SELECT * FROM tabel WHERE id = '" . mysql_real_escape_string($id) . '"';

?>
 
Martijn B

Martijn B

04/11/2006 10:42:00
Quote Anchor link
@Robert:

Ik gebruik alleen "..." als het ook echt nodig is. Dus als je bijvoorbeeld een enter (\n) wil hebben. Meestal wil je dat een string letterlijk door PHP wordt opgenomen.

Maar net wat je zegt het is maar wat je prettig / makkelijk / beter vind.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Altin

Altin

04/11/2006 11:56:00
Quote Anchor link
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
<?php
if(isset($_GET['bandid'])) {
    $bandid = $_GET['bandid'];
    if (is_numeric($bandid)){
        $lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ".  mysql_real_escape_string($bandid) . " ' ");
        echo "<ul>";
            while ($lyrics = mysql_fetch_array($lyricslist)) {
            $lyricsTitle = $lyrics["lyricsTitle"];
            $lyricsID = $lyrics["id"];
            echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
            }

        echo "</ul>";
    }
else {
        echo "Invalid Band!";
    }
}

?>


Ah ok bedankt.
Dus bovenstaande code is perfect veilig ?
(er is een db verbinding trouwes :p)
Gewijzigd op 01/01/1970 01:00:00 door Altin
 
Altin

Altin

04/11/2006 13:38:00
Quote Anchor link
trouwes, i dit hetzelfde ? (als bovenstaand ?)
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
<?php
if(isset($_GET['bandid'])) {
    $bandid = mysql_real_escape_string($_GET['bandid']);
    if (is_numeric($bandid)){
        $lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ".  $bandid . " ' ");
        echo "<ul>";
            while ($lyrics = mysql_fetch_array($lyricslist)) {
            $lyricsTitle = $lyrics["lyricsTitle"];
            $lyricsID = $lyrics["id"];
            echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
            }

        echo "</ul>";
    }
else {
        echo "Invalid Band!";
    }
}

?>


en dus ook nog steeds veilig ?
Het lijkt me in ieder geval makkelijker :p
thanks!
 
Robert Deiman

Robert Deiman

04/11/2006 13:42:00
Quote Anchor link
Je bedoelt dat je die mysql_real_escape_string(); al uitvoert voordat je de de variabele in de query gooit.
Dat maakt inderdaad voor de veiligheid niets uit, en als je het gemakkelijker vind werken, zou ik het gewoon op deze manier doen.
 
Frank -

Frank -

04/11/2006 13:48:00
Quote Anchor link
Tip: Schrijf een functie die overal alle user-input (COOKIE, GET, POST etc.) direct aanpakt met mysql_real_escape_string(). Dan hoef je dat niet meer handmatig te doen, dat ga je namelijk vergeten. Jan Koehoorn had daar een fraaie functie voor geschreven, wellicht dat hij je verder kan helpen.

En wat is hier het doel van:
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
? Dit kost alleen maar extra geheugen en levert verder geen enkel voordeel op. Gebruik dus gewoon $lyrics["id"] e.d. wanneer je deze waarde wilt echoen.

Verder ontbreekt nog steeds de controle of de query wel is gelukt. Dat gaat problemen opleveren!
 
Altin

Altin

04/11/2006 14:49:00
Quote Anchor link
Heb je toevallig een link naar die functie Frank ?
Zou idd veel makkelijker zijn.

En klopt het nu de manier waaropik kijk of de query is gelukt ?
Of moet ik die if elders plaatsen ?
BEdankt ! :)
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
<?php if(isset($_GET['bandid'])) {
    $bandid = mysql_real_escape_string($_GET['bandid']);
    if (is_numeric($bandid)){
        $lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ".  $bandid . " ' ");
        if($lyricslist){
        echo "<ul>";
            while ($lyrics = mysql_fetch_array($lyricslist)) {
            $lyricsTitle = $lyrics["lyricsTitle"];
            $lyricsID = $lyrics["id"];
            echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
            }
            }

        echo "</ul>";
        }
else {
            echo "failed: " .mysql_error();
        }
    }
else {
        echo "Invalid Band!";
    }
}

?>
 



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.