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

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Oracle APEX Developer PL/SQL

Bedrijfsomschrijving Als je altijd al in een Europees georiënteerde organisatie hebt willen werken, ben je hier aan het juiste adres! De organisatie biedt IT- en communicatieoplossingen aan kleine, middelgrote en grote ondernemingen in zowel de private als de publieke sector. De innovatieve oplossingen, ontworpen voor open connectiviteit, hoge beschikbaarheid en flexibele groei, bevatten de nieuwste spraak-, data- en videotechnologieën en maken real-time, samenwerking, verhoogde productiviteit en klanttevredenheid mogelijk. Samen met een team van 6 personen zullen jullie onder andere verantwoordelijk worden voor het ontwikkelen en verbeteren van business applicaties, ontwikkeld in Oracle Apex. Deze applicaties worden op dit moment voor

Bekijk vacature »

Specialist Informatiebeveiliging

Specialist Informatiebeveiliging Waar een linked-data-omgeving, 500 licenties op databanken en digitale tijdschriften en ISO 27001/27002 samenkomen. Dat is de KB in Den Haag. En het is de plek waar jij als specialist informatiebeveiliging waardevol digitaal erfgoed, maar ook informatie van en voor miljoenen bibliotheekbezoekers, beschermt tegen cybercriminaliteit. Stilstaan is geen optie. Als onze specialist informatiebeveiliging werk je in ons complexe IT-landschap met eindgebruikersdiensten, landelijke netwerkdiensten en diensten die ons nationaal erfgoed duurzaam opslaan. We ondersteunen de informatiebeveiliging vanuit een afdeling overstijgend team. Kortom, je staat er dus niet alleen voor! Als specialist informatiebeveiliging help je de KB-kaders vast te stellen

Bekijk vacature »

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

02/03/2021 14:07:52
 
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.
 
Ad Fundum

Ad Fundum

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 Ad Fundum
 



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.