Esercitazione PHP

PHP HOME Introduzione a PHP Installazione PHP Sintassi PHP Commenti PHP Variabili PHP PHP Eco/Stampa Tipi di dati PHP Stringhe PHP Numeri PHP PHP matematica Costanti PHP Operatori PHP PHP Se...Altro...Altro Passaggio PHP Ciclo PHP Funzioni PHP Matrici PHP Superglobali PHP RegEx PHP

Moduli PHP

Gestione dei moduli PHP Convalida del modulo PHP Modulo PHP richiesto URL/e-mail del modulo PHP Modulo PHP completo

PHP avanzato

Data e ora PHP PHP Include Gestione dei file PHP Apri/Leggi file PHP Creazione/scrittura di file PHP Caricamento file PHP Cookie PHP Sessioni PHP Filtri PHP Filtri PHP avanzati Funzioni di callback PHP PHP JSON Eccezioni PHP

PHP OOP

PHP Che cos'è OOP Classi/Oggetti PHP Costruttore PHP PHP distruttore Modificatori di accesso PHP Ereditarietà PHP Costanti PHP Classi astratte PHP Interfacce PHP Tratti PHP Metodi statici PHP Proprietà statiche PHP Spazi dei nomi PHP Iterabili PHP

Database MySQL

Database MySQL MySQL Connect MySQL Crea DB MySQL Crea tabella Dati di inserimento MySQL MySQL Ottieni l'ultimo ID MySQL inserisce più MySQL preparato MySQL Seleziona dati MySQL dove MySQL Ordina per MySQL Elimina dati Dati di aggiornamento MySQL Dati limite MySQL

PHP XML

Parser XML PHP Analizzatore PHP SimpleXML PHP SimpleXML - Ottieni PHP XML espatriato PHP XML DOM

PHP - AJAX

Introduzione all'Ajax AJAX PHP Database AJAX XML AJAX Ricerca in tempo reale AJAX Sondaggio AJAX

Esempi PHP

Esempi PHP compilatore PHP Quiz PHP Esercizi PHP Certificato PHP

Riferimento PHP

Panoramica di PHP matrice PHP Calendario PHP Data PHP Directory PHP Errore PHP Eccezione PHP File system PHP Filtro PHP PHP FTP PHP JSON Parole chiave PHP PHP Libxml Posta PHP PHP matematica PHP Varie PHP MySQLi Rete PHP Controllo dell'output PHP RegEx PHP PHP SimpleXML Flusso PHP Stringa PHP Gestione delle variabili PHP Analizzatore XML PHP Zip PHP Fuso orario PHP

Convalida del modulo PHP


Questo e i prossimi capitoli mostrano come utilizzare PHP per convalidare i dati dei moduli.


Convalida del modulo PHP

Pensa alla SICUREZZA durante l'elaborazione dei moduli PHP!

Queste pagine mostreranno come elaborare i moduli PHP tenendo conto della sicurezza. La corretta convalida dei dati del modulo è importante per proteggere il tuo modulo da hacker e spammer!

Il modulo HTML su cui lavoreremo in questi capitoli, contiene vari campi di input: campi di testo obbligatori e opzionali, pulsanti di opzione e un pulsante di invio:

Le regole di convalida per il modulo di cui sopra sono le seguenti:

Field Validation Rules
Name Required. + Must only contain letters and whitespace
E-mail Required. + Must contain a valid email address (with @ and .)
Website Optional. If present, it must contain a valid URL
Comment Optional. Multi-line input field (textarea)
Gender Required. Must select one

Per prima cosa esamineremo il semplice codice HTML per il modulo:



Campi di testo

I campi del nome, dell'e-mail e del sito Web sono elementi di input di testo e il campo dei commenti è un'area di testo. Il codice HTML è simile a questo:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

Tasti della radio

I campi del sesso sono pulsanti di opzione e il codice HTML è simile al seguente:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other

L'elemento della forma

Il codice HTML del modulo è simile al seguente:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Quando il modulo viene inviato, i dati del modulo vengono inviati con method="post".

Che cos'è la variabile $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] è una variabile super globale che restituisce il nome del file dello script attualmente in esecuzione.

Quindi, $_SERVER["PHP_SELF"] invia i dati del modulo inviato alla pagina stessa, invece di passare a una pagina diversa. In questo modo, l'utente riceverà messaggi di errore sulla stessa pagina del modulo.

Cos'è la funzione htmlspecialchars()?

La funzione htmlspecialchars() converte i caratteri speciali in entità HTML. Ciò significa che sostituirà i caratteri HTML come < e > con < e >. Ciò impedisce agli aggressori di sfruttare il codice iniettando codice HTML o Javascript (attacchi Cross-site Scripting) nei moduli.


Grande nota sulla sicurezza dei moduli PHP

La variabile $_SERVER["PHP_SELF"] può essere utilizzata dagli hacker!

Se nella tua pagina viene utilizzato PHP_SELF, un utente può inserire una barra (/) e quindi alcuni comandi Cross Site Scripting (XSS) da eseguire.

Il cross-site scripting (XSS) è un tipo di vulnerabilità della sicurezza del computer che si trova in genere nelle applicazioni Web. XSS consente agli aggressori di iniettare script lato client nelle pagine Web visualizzate da altri utenti.

Supponiamo di avere il seguente modulo in una pagina denominata "test_form.php":

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Ora, se un utente inserisce l'URL normale nella barra degli indirizzi come "http://www.example.com/test_form.php", il codice sopra sarà tradotto in:

<form method="post" action="test_form.php">

Fin qui tutto bene.

Tuttavia, considera che un utente inserisce il seguente URL nella barra degli indirizzi:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

In questo caso, il codice di cui sopra verrà tradotto in:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

Questo codice aggiunge un tag di script e un comando di avviso. E quando la pagina viene caricata, il codice JavaScript verrà eseguito (l'utente vedrà una finestra di avviso). Questo è solo un semplice e innocuo esempio di come sfruttare la variabile PHP_SELF.

Tieni presente che qualsiasi codice JavaScript può essere aggiunto all'interno del tag <script>! Un hacker può reindirizzare l'utente a un file su un altro server e quel file può contenere codice dannoso che può alterare le variabili globali o inviare il modulo a un altro indirizzo per salvare i dati dell'utente, ad esempio.


Come evitare gli exploit di $_SERVER["PHP_SELF"]?

Gli exploit $_SERVER["PHP_SELF"] possono essere evitati usando la funzione htmlspecialchars().

Il codice del modulo dovrebbe assomigliare a questo:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

La funzione htmlspecialchars() converte i caratteri speciali in entità HTML. Ora se l'utente tenta di sfruttare la variabile PHP_SELF, risulterà nel seguente output:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

Il tentativo di exploit fallisce e non viene fatto alcun danno!


Convalida i dati del modulo con PHP

La prima cosa che faremo è passare tutte le variabili attraverso la funzione htmlspecialchars() di PHP.

Quando usiamo la funzione htmlspecialchars(); quindi se un utente tenta di inviare quanto segue in un campo di testo:

<script>location.href('http://www.hacked.com')</script>

- questo non verrebbe eseguito, perché verrebbe salvato come codice di escape HTML, in questo modo:

<script>location.href('http://www.hacked.com')</script>

Il codice è ora sicuro per essere visualizzato su una pagina o all'interno di un'e-mail.

Faremo anche altre due cose quando l'utente invia il modulo:

  1. Elimina i caratteri non necessari (spazio extra, tabulazione, nuova riga) dai dati di input dell'utente (con la funzione PHP trim())
  2. Rimuovere le barre inverse (\) dai dati di input dell'utente (con la funzione PHP stripslashes())

Il passo successivo è creare una funzione che faccia tutto il controllo per noi (che è molto più conveniente che scrivere lo stesso codice più e più volte).

Chiameremo la funzione test_input().

Ora possiamo controllare ogni variabile $_POST con la funzione test_input() e lo script si presenta così:

Esempio

<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Si noti che all'inizio dello script, controlliamo se il modulo è stato inviato utilizzando $_SERVER["REQUEST_METHOD"]. Se REQUEST_METHOD è POST, il modulo è stato inviato e dovrebbe essere convalidato. Se non è stato inviato, salta la convalida e visualizza un modulo vuoto.

Tuttavia, nell'esempio sopra, tutti i campi di input sono facoltativi. Lo script funziona bene anche se l'utente non inserisce alcun dato.

Il passaggio successivo consiste nel rendere obbligatori i campi di input e creare messaggi di errore, se necessario.