Preventing SQL Injection with MySQL and PHP
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?
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.
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?
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 -
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
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!
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
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.
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. :-)
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 !