Funzione di sicurezza PHP: strip_tags, filter_var, Md5 e sha1
⚡ Riepilogo intelligente
PHP Security protegge le applicazioni web dagli aggressori e dagli input imprudenti convalidando, sanificando e archiviando i dati in modo sicuro. Questa guida illustra le principali minacce, quindi mostra strip_tags, filter_var, escapinge l'hashing moderno delle password con password_hash per difendersi da XSS, SQL injection e credenziali rubate.
Potenziali minacce alla sicurezza
Esistono fondamentalmente due gruppi di persone che possono attaccare il tuo sistema:
- Hacker: con l'intento di ottenere l'accesso a dati non autorizzati o interrompere l'applicazione
- Gli utenti potrebbero, involontariamente, inserire parametri errati nei moduli, con conseguenze negative per un sito web o un'applicazione web.
Di seguito sono elencati i tipi di attacchi a cui dobbiamo fare attenzione.
SQL Injection – questo tipo di attacco aggiunge codice dannoso a SQL dichiarazioni.
Ciò viene fatto utilizzando moduli di input dell'utente oppure URLche utilizzano variabili.
Il codice allegato commenta la condizione nella clausola WHERE di un'istruzione SQL. Il codice allegato può anche:
- inserire una condizione che sarà sempre vera
- eliminare i dati da una tabella
- aggiornare i dati in una tabella
Questo tipo di attacco viene solitamente utilizzato per ottenere l'accesso non autorizzato a un'applicazione.
Scripting tra siti (XSS) – questo tipo di attacco inserisce codice dannoso, di solito JavaScript. Questo viene fatto utilizzando moduli di input utente come i moduli di contatto e di commento. Questo viene fatto per:
- Recuperare informazioni sensibili come dati dei cookie
- Reindirizzare l'utente a un altro URL.
Tra le altre minacce si possono includere l'iniezione di codice PHP, l'iniezione di shell, l'iniezione di email e la divulgazione del codice sorgente degli script.
PHP Application Security migliori pratiche
Analizziamo ora alcune delle migliori pratiche di sicurezza PHP che dobbiamo considerare durante lo sviluppo.ping le nostre applicazioni.
strip_tag PHP
La funzione strip_tags rimuove l'HTML, JavaCopione, oppure tag PHP da una stringa.
Questa funzione è utile quando dobbiamo proteggere la nostra applicazione da attacchi come il cross-site scripting.
Consideriamo un'applicazione che accetta commenti dagli utenti.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Supponendo che tu abbia salvato comments.php nella cartella phptuts, vai a URL http://localhost/phptuts/comments.php
Supponiamo che tu riceva il seguente input dall'utente: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Passare al URL http://localhost/phptuts/comments.php
Procediamo ora a proteggere la nostra applicazione da tali attacchi utilizzando la funzione strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Passare al URL http://localhost/phptuts/comments.php
Funzione PHP filter_var
La funzione filter_var viene utilizzata per convalidare e disinfettare i dati.
La convalida controlla se i dati sono del tipo corretto. Un controllo di convalida numerica su una stringa restituisce un risultato falso.
La sanificazione sta rimuovendo i caratteri illegali da a stringa.
Consulta questo link per il riferimento completo: filtro_var
Il codice seguente si riferisce al sistema di commenti. Utilizza la funzione filter_var e la costante FILTER_SANITIZE_STRIPPED per rimuovere i tag.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Produzione:
alert('Your site sucks!');
Nota: FILTER_SANITIZE_STRIPPED (alias di FILTER_SANITIZE_STRING) è obsoleto a partire da PHP 8.1. Per il nuovo codice, utilizzare strip_tags() o, per una visualizzazione sicura, htmlspecialchars().
PHP mysqli_real_escape_string
La funzione mysqli_real_escape_string viene utilizzata per proteggere un'applicazione dalle iniezioni SQL.
Supponiamo di avere la seguente istruzione SQL per la convalida dell'ID utente e della password.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
Un utente malintenzionato può entrare ' OPPURE 1 = 1 — nel campo di testo dell'ID utente e 1234 nel campo di testo della password. Ora codifichiamo il modulo di autenticazione.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Il risultato finale sarà:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
QUI,
- “WHERE uid = ”” verifica se l'ID utente è vuoto
- “' O 1 = 1” è una condizione che sarà sempre vera
- Il simbolo “–” commenta la parte che verifica la password.
La query precedente restituirà tutti gli utenti. Utilizziamo ora la funzione mysqli_real_escape_string per proteggere il nostro modulo di login. Si noti che nel codice reale questa funzione accetta la connessione al database come primo argomento.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Il codice sopra riportato produrrà il seguente output:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Nota: il secondo apice singolo è stato preceduto da un carattere di escape, quindi verrà trattato come parte dell'ID utente e la password non verrà commentata.
migliori pratiche: ESCAping Sebbene utili, le istruzioni preparate parametrizzate in mysqli o PDO sono la difesa consigliata contro le SQL injection, poiché i dati non vengono mai mescolati al testo della query.
PHP Md5 e PHP sha1
MD5 è l'acronimo di Message Digest 5, e SHA1 è l'acronimo di Secure Hash Algorithm 1. Entrambe sono funzioni di hashing unidirezionali.
Il codice seguente mostra l'implementazione di md5 e sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Supponendo che tu abbia salvato il file hashes.php nella cartella phptuts, vai al URL.
Importante: MD5 e SHA1 sono hash veloci e non salati e sono non più considerato sicuro per la memorizzazione delle password, perché possono essere decifrati rapidamente con hardware moderno e tabelle rainbow. Utilizzateli solo per checksum non di sicurezza e usate il metodo descritto di seguito per le password.
Come crittografare le password in modo sicuro in PHP
Per la memorizzazione delle password, PHP offre le funzioni `password_hash` e `password_verify`. Queste applicano un algoritmo lento e con salt (bcrypt per impostazione predefinita), quindi ogni hash è univoco e costoso da decifrare, anche se il database viene rubato.
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- hash_password() genera un hash con salt da memorizzare nel database; PASSWORD_DEFAULT mantiene l'algoritmo attualmente consigliato.
- verifica_password() Verifica il tentativo di accesso confrontandolo con l'hash memorizzato, senza mai decifrarlo.
Poiché il salt e l'algoritmo sono memorizzati all'interno dell'hash, non è necessario gestirli manualmente, il che rende questo il metodo corretto e a prova di futuro per la gestione delle password in PHP.





