NULL naar database i.p.v. '' i.c.m. sql beveiliging

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bas van de Ven

Bas van de Ven

16/01/2021 16:36:54
Quote Anchor link
N.a.v. "topic verversen na submit in een loop" ben ik mijn mijn sql code aan het aanpassen.
Er wordt nl. geadviseerd om ook int variabelen tussen enkele quot's te zetten.

Dus niet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query_hok_toevoegen
= "INSERT INTO tblHok SET lidId = ".mysqli_real_escape_string($db,$lidId).", hoknr = '".mysqli_real_escape_string($db,$hok)."', scan = ".mysqli_real_escape_string($db,$insscan)." ";
?>

maar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query_hok_toevoegen
= "INSERT INTO tblHok SET lidId = '".mysqli_real_escape_string($db,$lidId)."', hoknr = '".mysqli_real_escape_string($db,$hok)."', scan = '".mysqli_real_escape_string($db,$insscan)."' ";
?>

Wat nu als de variabele leeg is of niet bestaat. Ik wil dan niet '' naar mijn database sturen maar NULL.
dus niet
INSERT INTO tblHok SET lidId = '5', hoknr = 'Hok 04', scan = '';
en (juist) ook niet
INSERT INTO tblHok SET lidId = '5', hoknr = 'Hok 04', scan = 'NULL';
maar
INSERT INTO tblHok SET lidId = '5', hoknr = 'Hok 04', scan = NULL;

Door de enkele quote's komt NULL als een string in de tabel i.p.v. een leeg veld.
Nu weet ik ook weer waarom ik niet alleen integer velden maar juist ook lege velden oplos zoals de eerste query hierboven maar dat terzijde.

Hoe krijg ik NULL naar mijn tabellen en voorkom ik tegelijkertijd SQL-injection ?
Alles wat ik op internet vind leidt niet tot een antwoord op deze vraag.

Wat ik op internet vind leidt meestal tot deze output : INSERT INTO tblHok SET lidId = '5', hoknr = 'Hok 04', scan = '';
Gewijzigd op 16/01/2021 16:38:11 door Bas van de Ven
 
PHP hulp

PHP hulp

21/12/2024 15:43:03
 
Rob Doemaarwat

Rob Doemaarwat

16/01/2021 17:12:18
Quote Anchor link
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
<?php

function my_db_quote($var){
  global $db;
  //Evt kun je ook meteen is_boolean($var) omzetten naar 0/1, enz
  return $var === null ? 'NULL' : "'" . mysqli_real_escape_string($db,$var) . "'";
}


$query_hok_toevoegen = "
  INSERT INTO tblHok
  SET lidId = "
.my_db_quote($lidId).",
      hoknr = "
.my_db_quote($hok).",
      scan = "
.my_db_quote($insscan);

?>
Gewijzigd op 16/01/2021 17:13:50 door Rob Doemaarwat
 
Bas van de Ven

Bas van de Ven

16/01/2021 19:59:47
Quote Anchor link
Bedankt, Rob dit is antwoord op mijn vraag.
 

17/01/2021 15:20:40
Quote Anchor link
Bas van de Ven op 16/01/2021 16:36:54:
N.a.v. "topic verversen na submit in een loop" ben ik mijn mijn sql code aan het aanpassen.
Er wordt nl. geadviseerd om ook int variabelen tussen enkele quot's te zetten.

Dat is niet wat Thomas je heeft geadviseerd, hij zegt:
Quote:
Het gebruik van real_escape_string() is niet veilig zonder quotes.

En hoewel dat klopt voor strings, is het voor integers niet nodig om real_escape_string() te gebruiken. Het zal aan de naam van de functie liggen.

De reden om die escape-functie te gebruiken is om onderscheid te maken tussen het SQL-commando, en de data die het commando verwerkt. Dat is nodig, omdat die data iets kan zijn dat via een browser verzonden heeft. Als je dat ongezien doorsluist naar de database, kan een kwaadwillend iemand dingen doen met jouw database die je liever niet wilt. Die constructie wordt MySQL-injectie genoemd.

Als je toch al weet dat je een integer wilt doorgeven, volstaat het om de variabale vooraf expliciet om te zetten naar een integer, zodat je zeker weet dat er geen SQL-commando's in kunnen voorkomen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$lidId
= (int) $lidId;  // voor de zekerheid
$hok = (int) $hok;      // idem
$insscan = "'" . mysqli_real_escape_string($db, $insscan) . "'";  // voor de string
$query_hok_toevoegen
  = 'INSERT INTO tblHok (lidId, hoknr, scan)'
  . ' VALUES (' . implode(',', [$iLidId, $hok, scan]) . ')';
?>

Een nog betere manier is om altijd prepared statements te gebruiken, dan is er nooit verwarring over wat SQL code is en wat data is. Je kunt daarbij een hulpfunctie verzinnen als mysqli_query_params().
Gewijzigd op 17/01/2021 15:38:50 door
 



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.