Dino Geek, cerca di aiutarti

Cos'è l'SQL injection e come prevenirla in PHP?


L’SQL injection è una tecnica di attacco in cui un malintenzionato inserisce (inserisce) codice SQL arbitrario in una query SQL tramite l’input dell’utente, con l’obiettivo di manipolare il database. Questo tipo di attacco può portare a risultati devastanti, come la visualizzazione di dati non autorizzati, la modifica o la cancellazione di dati, o addirittura il controllo totale del server di database. L’SQL injection è possibile quando un’applicazione non valida correttamente l’input dell’utente, permettendo l’esecuzione di comandi SQL indesiderati.

  1. Esempio di SQL Injection

Per esempio, se in un’applicazione PHP si ha una query che cerca un utente nel database tramite un nome utente fornito dall’utente stesso:

```
$username = $_GET[‘username’];
$query = “SELECT * FROM users WHERE username = ‘$username’”;
$result = mysqli_query($conn, $query);
```

Se un utente malintenzionato inserisce `admin’ —` come parametro `username`, la query SQL diventa:

```
SELECT * FROM users WHERE username = ‘admin’ —‘
```
Il `—` è un commento in SQL che fa sì che il resto della query venga ignorato. Questo significa che tutte le password vengono ignorate e l’attaccante ottiene accesso al record dell’amministratore.

  1. Prevenire l’SQL Injection

  1. 1. Utilizzare query parametrizzate

Uno dei metodi più efficaci per prevenire l’SQL injection è utilizzare query parametrizzate (o prepared statements), che permettono di separare il codice SQL dai dati. Questo metodo è supportato da molte librerie di database, come PDO (PHP Data Objects) per PHP.

Esempio con PDO:

```
// Connessione al database con PDO
$dsn = ‘mysql:host=localhost;dbname=testdb’;
$username = ‘root’;
$password = ‘’;
$options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

$pdo = new PDO;

// Utilizzo di una query parametrizzata
$stmt = $pdo->prepare(‘SELECT * FROM users WHERE username = :username’);
$stmt->bindParam(‘:username’, $_GET[‘username’]);
$stmt->execute();

$results = $stmt->fetchAll();
```

  1. 2. Utilizzare funzioni di escaping

Un’altra tecnica è utilizzare funzioni di escaping come `mysqli_real_escape_string()` che assicurano che i caratteri speciali nell’input dell’utente siano trattati come letterali anziché comandi.

```
// Connessione al database
$conn = new mysqli($servername, $username, $password, $dbname);

$username = $conn->real_escape_string($_GET[‘username’]);
$query = “SELECT * FROM users WHERE username = ‘$username’”;
$result = $conn->query($query);
```

  1. 3. Utilizzare ORM (Object-Relational Mapping)

Gli ORM, come Eloquent in Laravel o Doctrine in Symfony, offrono un livello di astrazione che rende più difficile comporre query SQL malformate, riducendo così il rischio di SQL injection.

```
// Esempio con Eloquent in Laravel
$user = User::where(‘username’, $username)->first();
```

  1. 4. Validazione e Sanificazione dell’Input

Dovresti sempre validare e sanificare l’input dell’utente per assicurarti che rispetti i formati attesi.

```
$username = filter_input(INPUT_GET, ‘username’, FILTER_SANITIZE_STRING);
```

  1. Conclusioni

L’SQL injection è una vulnerabilità molto pericolosa, ma con le giuste pratiche come l’uso di query parametrizzate, funzioni di escaping, ORM, e la validazione e sanificazione dell’input, è possibile prevenire efficacemente questi attacchi.

  1. Fonti

1. OWASP (Open Web Application Security Project). [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html)
2. PHP Manual. [PDO](https://www.php.net/manual/en/book.pdo.php)
3. W3Schools. [PHP and MySQL](https://www.w3schools.com/php/php_mysql_connect.asp)

Adottare queste misure di sicurezza può aiutarti a proteggere la tua applicazione PHP da attacchi SQL injection, garantendo la sicurezza dei dati e del sistema nel suo complesso.


Genera semplicemente articoli per ottimizzare il tuo SEO
Genera semplicemente articoli per ottimizzare il tuo SEO





DinoGeek offre articoli semplici su tecnologie complesse

Vuoi essere citato in questo articolo? È molto semplice, contattaci a dino@eiki.fr

CSS | NodeJS | DNS | DMARC | MAPI | NNTP | htaccess | PHP | HTTPS | Drupal | WEB3 | LLM | Wordpress | TLD | Nome dominio | IMAP | TCP | NFT | MariaDB | FTP | Zigbee | NMAP | SNMP | SEO | E-Mail | LXC | HTTP | MangoDB | SFTP | RAG | SSH | HTML | ChatGPT API | OSPF | JavaScript | Docker | OpenVZ | ChatGPT | VPS | ZIMBRA | SPF | UDP | Joomla | IPV6 | BGP | Django | Reactjs | DKIM | VMWare | RSYNC | Python | TFTP | Webdav | FAAS | Apache | IPV4 | LDAP | POP3 | SMTP

| Whispers of love (API) | Déclaration d'Amour |






Avviso Legale / Condizioni Generali di Utilizzo