Snelle escape voor mysql

Door Aapje yeah, 15 jaar geleden, 11.380x bekeken

Hallo,

Dit script gebruik ik eigenlijk veel binnen websites die ik maak om niet de hele tijd mysql_real_escape_string(); te schrijven.. (luie icter)

Gesponsorde koppelingen

PHP script bestanden

  1. fn.escape.php

 

Er zijn 21 reacties op 'Snippets'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Hoi Tim,

Waarom wil je direct alle post data escapen? En waarom direct met mysql_real_escape_string() ? Je gebruikt de post data niet altijd in een query toch?

Je zou dan beter kunnen kijken naar de normale filter functies en dan in een query pas mysql_real_escape_string() gebruiken.
Gerhard l
gerhard l
15 jaar geleden
 
0 +1 -0 -1
# De variabele $_POST, $_GET, $_SESSION, etc. zijn gewoon arrays

Waarom controleer je dan nog of het een array is?
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Daarnaast controleren we op de volgende manier of er een REQUEST is geweest.

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

if ($_SERVER['REQUEST_METHOD'] == 'POST') {}

?>


Kan je dit en het bovenstaande verwerken / aanpassen in je script? Op dit moment heeft dit script geen enkele toegevoegde waarde aan de script library van PHPhulp.

Alvast bedankt,

Niels Kieviet
Aapje yeah
Aapje yeah
15 jaar geleden
 
0 +1 -0 -1
@ gerhard l:
Als ik niet controleer of het een array is, ziet deze functie een gewone variabele ook als array en dan krijg je fouten met foreach

@Niels:
Dit is een functie die je opvraagt, dus dit wordt niet direct in gebruik genomen wanneer er een form verstuurd is.

Dus deze zal alleen zijn als je het in de database wil verwerken.

Ik dacht, gewoon simpel niet te veel poespas, is wel eens handig.
Jeroen VD
Jeroen VD
15 jaar geleden
 
0 +1 -0 -1
Niels bedoelt wat anders. jij controleert hier alleen of er op de verzendknop is gedrukt. maar dan kunnen de velden nog steeds leeg zijn.

en daarbij, nu moet je nog elke keer mysql_real_escape_string toepassen, zij het niet direct. dit script is dus langzamer dan wanneer je dit handmatig doet. en het verbetert de leesbaarheid ook niet helemaal
Phpnuke r
phpnuke r
15 jaar geleden
 
0 +1 -0 -1
Je kan ook gewoon PDO gebruiken, of mysql_query direct escapen. Ikzelf heb een functie die dit direct escaped (in pdo)

database_object("SELECT * FROM users WHERE id=?", $_GET['id']);

<< tot 6 escapes (meer heb ik er niet nodig :P)

Ik ben zelf geen fan van mysql_query, pdo werkt veel fijner en bovendien ondersteunt het multiple databases (en ook meerdere connecties tegelijk wat mysql_query niet doet)
Wouter J
Wouter J
15 jaar geleden
 
0 +1 -0 -1
Ook mysql_query support meerdere connecties tegelijk.

En als je dan PDO gebruikt moet je natuurlijk wel prepared statements gebruiken, dan heb je al deze functies niet meer nodig...
Phpnuke r
phpnuke r
15 jaar geleden
 
0 +1 -0 -1
Hoe wil je dat met mysql_connect doen?

mysql_connect("wat_zal_ik_eens_nemen");
mysql_select_db("koekjes");
mysql_select_db("fruit");
<< Nu werkt de database koekjes lijkt me niet meer?

Quote:
En als je dan PDO gebruikt moet je natuurlijk wel prepared statements gebruiken, dan heb je al deze functies niet meer nodig...

Ik heb het hele pdo systeem in functies gezet, omdat dit beter werkt in mijn open source project. Bijvoorbeeld als er een nieuwe (betere) manier voor database connecties komt kan ik direct overstappen. Bovendien scheelt het een hoop werk (altans vind ik)
Wouter J
Wouter J
15 jaar geleden
 
0 +1 -0 -1
>> Nu werkt de database koekjes lijkt me niet meer?
Door juist gebruik te maken van MySQL functies:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $linkID1
= mysql_connect('host', 'user', 'pass');
    mysql_select_db('foo', $linkID1);
    
    $linkID2 = mysql_connect('host', 'user', 'pass');
    mysql_select_db('bar', $linkID2);
?>
Phpnuke r
phpnuke r
15 jaar geleden
 
0 +1 -0 -1
Haha dat wist ik niet:P Ik gebruik ook nooit 2 databases tegelijk (die support wil ik wel ooit geven in mijn project)
Niels K
Niels K
15 jaar geleden
 
1 +1 -0 -1
@Jeroen,

Nee ook dat bedoelde ik niet. Het is heel goed dat je $_POST / $_GET data wil escapen maar strict gezien moet je dat niet hier doen maar in de query.

Waarom? Nou, het kan zo maar eens voorkomen dat je na de functie nog wat extra handelingen uitvoert. (misschien niet eens expres)

Het is ansich niet slecht om bepaalde zaken te abstraheren maar in dit geval sla je naar mijn mening de plank een beetje mis.

Kan je dit verbeteren? Anders schotelen we gebruikers van PHPhulp minder goede oplossingen voor en dat willen we natuurlijk niet hebben ;-)

Succes!

Toevoeging:

Wat je wel kan doen is het maken van een functie die automatisch de parameters in een query escaped. Iets als dit: (fouten voorbehouden, heb even niet de mogelijkheid om het te testen)

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

function getSafeQuery($query, $params = array()) {
    $newParams = array();
    if (count($params) > 0) {
        foreach ($params as $param) {
            // Alle parameters escapen
            $newParams[] = mysql_real_escape_string($param);
        }

// Query met gevulde values
            return (vsprintf(str_replace('?', "'%s'", $newParams)));

    }

    return $query;
}


?>


Wat je ook kan doen is de params op basis van reference escapen. Scheelt je een nieuwe array, maar ik vind het bovenstaande mooier.

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

function getSafeQuery($query, $params = array()) {
    if (count($params) > 0) {
        foreach ($params as &$param) {
            // Alle parameters escapen
            // Doormiddel van de 'by reference' methode is de param
            // in de Array params geëscaped.

            $param = mysql_real_escape_string($param);
            // Query met gevulde values
            return (vsprintf(str_replace('?', "'%s'", $newParams)));
        }
    }

    return $query;
}


?>


Gebruik is dan als volgt:

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

// Single
$safeQuery = getSafeQuery("SELECT a FROM b WHERE c = ?", array('d'));

// Multiple
$safeQuery = getSafeQuery("SELECT a FROM b WHERE c = ? AND d = ?", array('e', 'f'));

?>


Begrijp je dit?

Niels Kieviet
Aapje yeah
Aapje yeah
15 jaar geleden
 
0 +1 -0 -1
Hallo Niels,

Ik begrijp jouwn opset inderdaad wel, maar is het zoveel beter wat jij hebt getypt? opzich doet het script hetzelfde alleen op een andere manier.
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Hoi Tim,

Het script doet inderdaad hetzelfde. Het gaat mij alleen om het idee hoe het wordt toegepast. Jij past mysql_real_escape_string (wat bij een query hoort) toe op $_POST / $_GET data. Dat vind ik een denkfout.

Zoals ik al zei is het scheiden van diversen onderdelen niet erg, mits het goed gebeurd.

Niels
Aapje yeah
Aapje yeah
15 jaar geleden
 
0 +1 -0 -1
hmm.. ik moet eerlijk toegeven dat ik dit ook altijd toepas bij query's en niet bij file include met get gegevens bijvoorbeeld. Maar jouwn punt klopt inderdaad wel. k snap hem
Jeroen VD
Jeroen VD
15 jaar geleden
 
0 +1 -0 -1
Quote:
Kan je dit verbeteren? Anders schotelen we gebruikers van PHPhulp minder goede oplossingen voor en dat willen we natuurlijk niet hebben ;-)

Bedoel je mijn reactie of het script van tim?
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Quote:
hmm.. ik moet eerlijk toegeven dat ik dit ook altijd toepas bij query's en niet bij file include met get gegevens bijvoorbeeld. Maar jouwn punt klopt inderdaad wel. k snap hem

Prima, wil je dit wel even in als commentaar bij de script plaatsen? Anders bestaat de kans dat het script door sommige mensen verkeerd wordt geïmplementeerd.

Quote:
Bedoel je mijn reactie of het script van tim?

Ik bedoelde het script van Tim ;-)
Aapje yeah
Aapje yeah
15 jaar geleden
 
0 +1 -0 -1
Dit script is meer dan 7 dagen geleden geplaatst, wijzigen is hierna niet meer mogelijk...
Wouter J
Wouter J
15 jaar geleden
 
0 +1 -0 -1
Ja, idioot ding op PHPhulp dat ze maar niet weg willen doen. Je zult Niels een PM moeten sturen en die kan het dan voor je aanpassen.
Beetje omslachtig en het kost de moderatoren meer werk, maar het is niet anders...
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Hoi Timm....eh,

Als je de tekst even, via een PM, naar mij toestuurt zal ik het script updaten.

@Wouter,

Ach, ik doe het graag ;-)
Wouter J
Wouter J
15 jaar geleden
 
0 +1 -0 -1
Nog een extra tip die je in de functie kan zetten:

Een kleine beveiliging voor UPDATE en DELETE queries, voor het geval je per ongeluk de WHERE vergeet:
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

function getSafeQuery($query, $params = array()) {
    $newParams = array();
    if (count($params) > 0) {
        foreach ($params as $param) {
            // Alle parameters escapen
            $newParams[] = mysql_real_escape_string($param);
        }

// Query met gevulde values
            return (vsprintf(str_replace('?', "'%s'", $newParams)));

    }

    if( preg_match('/^(UPDATE|DELETE)/i', $query)
        && !
preg_match('/WHERE\s(.*?=.*?)+/i', $query)
      )

      trigger_error('There is no WHERE statement in the query, are you sure you want to update/delete the hole database?');
    return $query;
}


?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Aapje yeah
Aapje yeah
15 jaar geleden
 
0 +1 -0 -1
Hey wouter,

Ja die functie is idd wel leuk! ga m misschien nog wel ergens toepassen.

Maar deze functie is strict bedoelt om te escapen :P

no offence

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

Inhoudsopgave

  1. fn.escape.php

Labels

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.