No, non lo fa, usa istruzioni preparate così come lo è una singola query funzioni e corretta convalida dell'input. Quest'ultimo è l'impostazione predefinita per la maggior parte delle funzioni in PHP (ad esempio mysqli::query
Vs. mysqli::multi_query
).
Istruzioni preparate
Le istruzioni preparate inoltrano i dati di una variabile e il suo tipo separatamente al DBMS che a sua volta sfuggirà a tutti i caratteri offensivi o analizzerà i dati indipendentemente dalla query effettiva (a seconda del DBMS). Non c'è niente da sapere su quali personaggi devono essere sfuggiti e quali no. Questo è il modo più sicuro per raggiungere questo obiettivo.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli(null, null, null, "database");
$mysqli->prepare("SELECT * FROM 'users' WHERE 'id' = ?");
$mysqli->bind_param("d", $_GET["id"]);
$mysqli->execute();
// ...
Tutta questa complessità può essere astratta, dai un'occhiata ad es. Drupal source code.
Funzioni di query singole
Le singole funzioni di ricerca assicurano che una tua query genererà sempre una sola query che verrà passata al DBMS. Uccidere efficacemente ogni possibilità che qualcuno interrompa la tua query e ne esegue un'altra; uno scenario tipico con SQL injection, esempio:
<?php
$_GET["id"] = "1;SET foreign_key_checks=0;DROP TABLE users";
$mysqli->multi_query("SELECT * FROM 'users' WHERE 'id' = {$_GET["id"]}");
Validation
Questo è forse il consiglio più importante ed è sempre importante, indipendentemente da ciò che cerchi di ottenere. Utilizza le funzioni filter_*
integrate in PHP e controlla altri progetti di grandi dimensioni per la convalida di materiale non coperto da queste funzioni.
Esempio combinato
Mettiamo tutto insieme.
<?php
// max_range default is PHP_INT_MAX.
$userId = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT, array(
"options" => array("min_range" => 1),
));
// Contains either a valid integer now or either FALSE or NULL.
if ($userId === null || $userId === false) {
//if (!$userId) {
throw new \InvalidArgumentException();
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli(null, null, null, "database");
$stmt = $mysqli->prepare("SELECT 'name' FROM 'users' WHERE 'id' = ?");
%stmt->bind_param("d", $userId);
$stmt->execute();
$stmt->fetch($userName);
$stmt->close();
$mysqli->close();
exit("Hello {$userName} with {$userId}.");