Preventing SQL Injection with MySQL and PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mar kla

mar kla

10/06/2025 15:13:57
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE
    p.as_season_id =  '".clean_query($season_id)."'


En via de function 'clean_query" krijg ik een "schone" string terug, toch?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}


Nu probeer ik een mysqli versie er van te maken. Maar dat lukt me dus niet :-(

Dit is mijn poging
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysqli_real_escape_string($dbconnection_as, $string));



Mijn vragen zijn deze: is deze code om te bouwen tot mysqli
of is er een kortere / betere methode?
 
PHP hulp

PHP hulp

13/06/2025 15:08:18
 
Ivo P

Ivo P

10/06/2025 15:45:50
Quote Anchor link
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.
 
Mar kla

mar kla

10/06/2025 15:55:31
Quote Anchor link
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)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}


in de function.php staat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}


In het errorlog staat mysqli_real_escape_string() expects parameter 1 to be mysqli, null given


wat doe ik fout?
 
- Ariën  -
Beheerder

- Ariën -

10/06/2025 17:58:17
Quote Anchor link
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.
Gewijzigd op 10/06/2025 18:01:58 door - Ariën -
 
Mar kla

mar kla

10/06/2025 18:13:16
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$string = mysqli_real_escape_string($dbconnection_as, $string);
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
 
- Ariën  -
Beheerder

- Ariën -

10/06/2025 18:15:44
Quote Anchor link
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.
Gewijzigd op 10/06/2025 18:19:54 door - Ariën -
 
Mar kla

mar kla

10/06/2025 18:59:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    p.as_season_id = mysqli_real_escape_string(".$dbconnection_as, $seasonid.")

is net zo goed als een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    p.as_season_id = clean_query('.$seasonid.")


Denk ik... ;-)
 
- Ariën  -
Beheerder

- Ariën -

10/06/2025 19:05:33
Quote Anchor link
Klopt!
 
Mar kla

mar kla

10/06/2025 19:41:42
Quote Anchor link
Ik twijfel of die $dbconnection_as wel "doorkomt"

er staat een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if (mysqli_connect_errno()) {
  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
 
- Ariën  -
Beheerder

- Ariën -

10/06/2025 21:19:30
Quote Anchor link
Zie mijn vorige post van 18:15:44
Gewijzigd op 10/06/2025 21:19:54 door - Ariën -
 
- SanThe -

- SanThe -

11/06/2025 08:30:22
Quote Anchor link
Mar kla op 10/06/2025 15:55:31:
in de function.php staat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

De global moet wel IN de function staan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
include_once('connect.php');

function clean_query($string)
{    GLOBAL $dbconnection_as;
    $string = mysqli_real_escape_string($dbconnection_as, $string);
return $string;
}
 
Ivo P

Ivo P

11/06/2025 10:00:44
Quote Anchor link
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. :-)
 
Mar kla

mar kla

12/06/2025 10:55:44
Quote Anchor link
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 !
 



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.