Preventing SQL Injection with MySQL and PHP
Ooit heel lang geleden heb ik onderstaand function script "gekregen/gevonden"
Daarmee vang ik ongewenste input mee af...als ik het goed heb begrepen.
In een query set ik deze code:
En via de function 'clean_query" krijg ik een "schone" string terug, toch?
Nu probeer ik een mysqli versie er van te maken. Maar dat lukt me dus niet :-(
Dit is mijn poging
Mijn vragen zijn deze: is deze code om te bouwen tot mysqli
of is er een kortere / betere methode?
Daarmee vang ik ongewenste input mee af...als ik het goed heb begrepen.
In een query set ik deze code:
En via de function 'clean_query" krijg ik een "schone" string terug, toch?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# Preventing SQL Injection with MySQL and PHP
function clean_query($string)
{
if(get_magic_quotes_gpc())
{$string = stripslashes($string);}
if (phpversion() >= '4.3.0')
{$string = mysql_real_escape_string($string);}
else
{$string = mysql_escape_string($string);}
return $string;
}
function clean_query($string)
{
if(get_magic_quotes_gpc())
{$string = stripslashes($string);}
if (phpversion() >= '4.3.0')
{$string = mysql_real_escape_string($string);}
else
{$string = mysql_escape_string($string);}
return $string;
}
Nu probeer ik een mysqli versie er van te maken. Maar dat lukt me dus niet :-(
Dit is mijn poging
Mijn vragen zijn deze: is deze code om te bouwen tot mysqli
of is er een kortere / betere methode?
Ik zou het inderdaad houden op die regel die jij geeft.
magic-quotes is een gedrocht uit de oudheid van PHP waarbij "voor de veiligheid" vanalles in de input-variabelen maar vast voorzien werd van \\\\
óók voor input die helemaal niet naar een database ging.
Ik zou er ook geen losse functie voor gebruiken: dan moet je ook weer zorgen dat $dbconnection_as ook bekend is binnen de function.
Maar als je verbetering zoekt: ik zou nóg liever gaan voor prepared statements.
magic-quotes is een gedrocht uit de oudheid van PHP waarbij "voor de veiligheid" vanalles in de input-variabelen maar vast voorzien werd van \\\\
óók voor input die helemaal niet naar een database ging.
Ik zou er ook geen losse functie voor gebruiken: dan moet je ook weer zorgen dat $dbconnection_as ook bekend is binnen de function.
Maar als je verbetering zoekt: ik zou nóg liever gaan voor prepared statements.
even voor mijn beeld ....wat is een prepared statements? :-|
Toevoeging op 10/06/2025 16:44:18:
Het lukt niet helemaal :-(
in mijn connect.php heb ik staan
(ipv de $server etc uiteraard de juiste waardes)
in de function.php staat
In het errorlog staat mysqli_real_escape_string() expects parameter 1 to be mysqli, null given
wat doe ik fout?
Toevoeging op 10/06/2025 16:44:18:
Het lukt niet helemaal :-(
in mijn connect.php heb ik staan
(ipv de $server etc uiteraard de juiste waardes)
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$dbconnection_as = mysqli_connect($server,$user,$pass, $db);
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
in de function.php staat
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
include_once('connect.php');
GLOBAL $dbconnection_as;
function clean_query($string)
{ $string = mysqli_real_escape_string($dbconnection_as, $string);
return $string;
}
GLOBAL $dbconnection_as;
function clean_query($string)
{ $string = mysqli_real_escape_string($dbconnection_as, $string);
return $string;
}
In het errorlog staat mysqli_real_escape_string() expects parameter 1 to be mysqli, null given
wat doe ik fout?
Prepared statements kan je vergelijken met een sjabloon voor een SQL-statement gemaakt en naar de database verzonden. Bepaalde waarden blijven ongespecificeerd, parameters genoemd (aangeduid met "?"). Je hoeft je dan niet met te bekommeren om escaping.
Er is genoeg documentatie over te vinden.
Over je tweede vraag: $dbconnection_as geeft geen juist resultaat. Mist de connectie niet? Al zou ik persoonlijk ervoor kiezen om GLOBAL te vermijden en deze via een argument mee te geven.
Maar wat is volgens jouw het nut om een functie zelf te kopieren? Het klinkt zinloos.
Er is genoeg documentatie over te vinden.
Over je tweede vraag: $dbconnection_as geeft geen juist resultaat. Mist de connectie niet? Al zou ik persoonlijk ervoor kiezen om GLOBAL te vermijden en deze via een argument mee te geven.
Maar wat is volgens jouw het nut om een functie zelf te kopieren? Het klinkt zinloos.
Gewijzigd op 10/06/2025 18:01:58 door - Ariën -
Dat Prepared statements heb ik idd genoeg documentatie gevonden. Dus dat ga ik later even bekijken.
De connect.php gebruik ik ook in andere scripts en daar werkt het.
Maar waarom hij de de Functions.php nioet werkt.....
Met die GLOBAL dacht /hoopte ik te bereiken dat hij ook zou worden herkent.
Ik kopieer de functie juist niet. in het functions.php bestand heb ik één functie staan met: mysqli_real_escape_string en die functie wordt waar nodig vanuit andere scripts aangeroepen.
De connect.php gebruik ik ook in andere scripts en daar werkt het.
Maar waarom hij de de Functions.php nioet werkt.....
Met die GLOBAL dacht /hoopte ik te bereiken dat hij ook zou worden herkent.
Ik kopieer de functie juist niet. in het functions.php bestand heb ik één functie staan met: mysqli_real_escape_string en die functie wordt waar nodig vanuit andere scripts aangeroepen.
Gewijzigd op 10/06/2025 18:13:51 door mar kla
Waarom zou je niet gewoon mysqli_real_escape_string($dbconnection_as, $string) gebruiken in plaats van de clean_query()?
Verder hoort die global IN de functie.
Verder hoort die global IN de functie.
Gewijzigd op 10/06/2025 18:19:54 door - Ariën -
Ja dat is een goede vraag :-)
Die clean_query() had ik als functie gemaakt, omdat ik die dan maar op één locatie hoeft te beheren.
Maar een
is net zo goed als een
Denk ik... ;-)
Die clean_query() had ik als functie gemaakt, omdat ik die dan maar op één locatie hoeft te beheren.
Maar een
is net zo goed als een
Denk ik... ;-)
Klopt!
Ik twijfel of die $dbconnection_as wel "doorkomt"
er staat een
bij, maar ik zie nergens een melding dat het fout gaat :-(
er staat een
Code (php)
1
2
3
4
2
3
4
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
bij, maar ik zie nergens een melding dat het fout gaat :-(
Gewijzigd op 10/06/2025 19:42:08 door mar kla
Zie mijn vorige post van 18:15:44
Gewijzigd op 10/06/2025 21:19:54 door - Ariën -
Mar kla op 10/06/2025 15:55:31:
De global moet wel IN de function staan.
Maar zoals een paar keer gezegd: clean_query() doet nu niets anders meer dan mysqli-escapen.
Die overbodige stripslashses was vroeger ooit nuttig, maar nu dus weg.
En omdat mysqli- functies nu een verbinding met de database nodig hebben, moet je die verbinding binnen je functie zien te krijgen.
de oude mysql-functies hadden die parameter in principe ook, maar gebruikten in de praktijk als deze niet gegeven was gewoon "een" actuele verbinding die php beschikbaar had. dat was rommelig.
Argument om clean_query in ere te houden, is gemak, omdat je dan niet op 100 plekken de functie-aanroep moet aanpassen.
Maar een slimme zoek-en-vervang lost dat ook voor je op. :-)
Die overbodige stripslashses was vroeger ooit nuttig, maar nu dus weg.
En omdat mysqli- functies nu een verbinding met de database nodig hebben, moet je die verbinding binnen je functie zien te krijgen.
de oude mysql-functies hadden die parameter in principe ook, maar gebruikten in de praktijk als deze niet gegeven was gewoon "een" actuele verbinding die php beschikbaar had. dat was rommelig.
Argument om clean_query in ere te houden, is gemak, omdat je dan niet op 100 plekken de functie-aanroep moet aanpassen.
Maar een slimme zoek-en-vervang lost dat ook voor je op. :-)
Op basis van alle tips / hints/ suggesties / etc
Heb ik even wat uurtjes zitten lezen en klooien.
Ik ben er nu met succes 50 scripts aan het aanpassen
dank voor de en reacties en hulp !
Heb ik even wat uurtjes zitten lezen en klooien.
Ik ben er nu met succes 50 scripts aan het aanpassen
dank voor de en reacties en hulp !
** modedit **
Stop met spammen! Op naar de eeuwige banvelden!
Stop met spammen! Op naar de eeuwige banvelden!
Gewijzigd op 13/11/2025 11:50:46 door - Ariën -



