Snelle escape voor mysql
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
21 reacties op 'Snelle escape voor mysql'
Gesponsorde koppelingen
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.
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:
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.
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.
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
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
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)
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)
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?
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)
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)
>> Nu werkt de database koekjes lijkt me niet meer?
Door juist gebruik te maken van MySQL functies:
Door juist gebruik te maken van MySQL functies:
Code (php)
1
2
3
4
5
6
7
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);
?>
$linkID1 = mysql_connect('host', 'user', 'pass');
mysql_select_db('foo', $linkID1);
$linkID2 = mysql_connect('host', 'user', 'pass');
mysql_select_db('bar', $linkID2);
?>
@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)
Wat je ook kan doen is de params op basis van reference escapen. Scheelt je een nieuwe array, maar ik vind het bovenstaande mooier.
Gebruik is dan als volgt:
Begrijp je dit?
Niels Kieviet
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
?>
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)
Begrijp je dit?
Niels Kieviet
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
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
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 ;-)
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:
Een kleine beveiliging voor UPDATE en DELETE queries, voor het geval je per ongeluk de WHERE vergeet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}
?>
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;
}
?>
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Timmmmmeh yeah- 4 maanden geleden
- 958 x bekeken
- Labels
php, script, mysql, sql, injections
- PHP scripts opties
- Snippets
- Nieuwste PHP scripts
- PHP script toevoegen


PHP hulp
0 seconden vanaf nu