NULL naar database i.p.v. '' i.c.m. sql beveiliging
Er wordt nl. geadviseerd om ook int variabelen tussen enkele quot's te zetten.
Dus niet
Code (php)
1
2
3
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)." ";
?>
$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)
1
2
3
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)."' ";
?>
$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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
?>
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
Bedankt, Rob dit is antwoord op mijn vraag.
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.
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)
1
2
3
4
5
6
7
8
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]) . ')';
?>
$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().