sql >> Database >  >> RDS >> Mysql

PHP MySQLI SQL-injectie voorkomen

Elke query kan worden geïnjecteerd, of deze nu lezen of schrijven, permanent of tijdelijk is. Injecties kunnen worden uitgevoerd door één zoekopdracht te beëindigen en een afzonderlijke uit te voeren (mogelijk met mysqli ), waardoor de beoogde zoekopdracht irrelevant wordt.

Elke invoer voor een query van een externe bron, of deze nu afkomstig is van gebruikers of zelfs intern, moet worden beschouwd als een argument voor de query en als een parameter in de context van de query. Elke parameter in een query moet worden geparametriseerd. Dit leidt tot een correct geparametriseerde query waarvan u een voorbereide instructie kunt maken en uitvoeren met argumenten. Bijvoorbeeld:

SELECT col1 FROM t1 WHERE col2 = ?

? is een tijdelijke aanduiding voor een parameter. mysqli gebruiken , kunt u een voorbereide verklaring maken met prepare , bind een variabele (argument) aan een parameter met behulp van bind_param , en voer de query uit met execute . U hoeft het argument helemaal niet te zuiveren (in feite is het schadelijk om dit te doen). mysqli doet dat voor je. Het volledige proces zou zijn:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Er is ook een belangrijk onderscheid tussen geparametriseerde zoekopdracht en voorbereide verklaring . Deze verklaring, hoewel voorbereid, is niet geparametriseerd en is dus kwetsbaar voor injectie:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Samenvattend:

  • Alle Query's moeten correct worden geparametriseerd (tenzij ze geen parameters hebben)
  • Alle argumenten voor een zoekopdracht moeten zo vijandig mogelijk worden behandeld, ongeacht hun bron



  1. Configuratietabellen gebruiken om de werkelijke workflow te definiëren

  2. Python:gegevens opvragen op geluid

  3. Splits IPv4-adres in 4 cijfers in Oracle sql

  4. SQL - Update meerdere records in één query