PHP
Lettura dei dati di richiesta
Ricerca…
Osservazioni
Scegliere tra GET e POST
Le richieste GET sono le migliori per fornire i dati necessari per il rendering della pagina e possono essere utilizzati più volte (query di ricerca, filtri dati ...). Fanno parte dell'URL, il che significa che possono essere aggiunti ai segnalibri e vengono spesso riutilizzati.
Le richieste POST, d' altro canto, sono pensate per inviare dati al server solo una volta (moduli di contatto, moduli di accesso ...). A differenza di GET, che accetta solo ASCII, le richieste POST consentono anche dati binari, inclusi i caricamenti di file .
Puoi trovare una spiegazione più dettagliata delle loro differenze qui .
Richiedi vulnerabilità dei dati
Guarda anche: quali sono le vulnerabilità nell'uso diretto di GET e POST?
Il recupero dei dati dai superglobali $ _GET e $ _POST senza alcuna convalida è considerato una cattiva pratica e apre metodi per consentire agli utenti di accedere o compromettere i dati attraverso codice e iniezioni SQL . I dati non validi dovrebbero essere controllati e respinti in modo da prevenire tali attacchi.
I dati della richiesta devono essere salvati in base a come viene utilizzato nel codice, come indicato qui e qui . In questa risposta è possibile trovare alcune diverse funzioni di escape per casi di utilizzo di dati comuni.
Gestione degli errori di caricamento dei file
$_FILES["FILE_NAME"]['error']
(dove "FILE_NAME"
è il valore dell'attributo name dell'input del file, presente nel modulo) potrebbe contenere uno dei seguenti valori:
-
UPLOAD_ERR_OK
- Non ci sono errori, il file è stato caricato con successo. -
UPLOAD_ERR_INI_SIZE
- Il file caricato supera la direttiva upload_max_filesize inphp.ini
. -
UPLOAD_ERR_PARTIAL
- Il file caricato supera la direttiva MAX_FILE_SIZE che è stata specificata nel modulo HTML. -
UPLOAD_ERR_NO_FILE
- Nessun file è stato caricato. -
UPLOAD_ERR_NO_TMP_DIR
- Manca una cartella temporanea. (Da PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
- Impossibile scrivere il file su disco. (Da PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- Un'estensione PHP ha interrotto il caricamento del file. (Da PHP 5.2.0).
Un modo semplice per verificare gli errori è il seguente:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
Lettura dei dati POST
I dati di una richiesta POST vengono memorizzati nel superglobale $_POST
sotto forma di un array associativo.
Si noti che l'accesso a un elemento dell'array inesistente genera una notifica, quindi l'esistenza dovrebbe sempre essere verificata con le funzioni isset()
o empty()
o l'operatore di coalesce null.
Esempio:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
Leggere i dati GET
I dati di una richiesta GET sono memorizzati nel superglobale $_GET
sotto forma di un array associativo.
Si noti che l'accesso a un elemento dell'array inesistente genera una notifica, quindi l'esistenza dovrebbe sempre essere verificata con le funzioni isset()
o empty()
o l'operatore di coalesce null.
Esempio: (per URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
Lettura di dati POST non elaborati
Di solito i dati inviati in una richiesta POST sono coppie chiave / valore strutturate con un tipo di application/x-www-form-urlencoded
MIME application/x-www-form-urlencoded
. Tuttavia, molte applicazioni come i servizi Web richiedono invece l'invio di dati non elaborati, spesso in formato XML o JSON. Questi dati possono essere letti utilizzando uno dei due metodi.
php://input
è uno stream che fornisce l'accesso al corpo della richiesta grezza.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
è una variabile globale che contiene i dati POST non $HTTP_RAW_POST_DATA
. È disponibile solo se la direttiva always_populate_raw_post_data
in php.ini
è abilitata.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Questa variabile è stata deprecata dalla versione 5.6 di PHP ed è stata rimossa in PHP 7.0.
Notare che nessuno di questi metodi è disponibile quando il tipo di contenuto è impostato su multipart/form-data
, che viene utilizzato per i caricamenti di file.
Caricamento di file con HTTP PUT
PHP fornisce supporto per il metodo PUT HTTP utilizzato da alcuni client per memorizzare file su un server. Le richieste PUT sono molto più semplici di un caricamento di file usando le richieste POST e assomigliano a questo:
PUT /path/filename.html HTTP/1.1
Nel tuo codice PHP dovresti fare qualcosa del genere:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
Anche qui puoi leggere interessanti domande / risposte SO sulla ricezione di file tramite HTTP PUT.
Passare gli array di POST
Di solito, un elemento di modulo HTML inviato a PHP produce un singolo valore. Per esempio:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Ciò risulta nell'output seguente:
Array
(
[foo] => bar
)
Tuttavia, potrebbero esserci casi in cui si desidera passare una matrice di valori. Questo può essere fatto aggiungendo un suffisso simile a PHP al nome degli elementi HTML:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
Ciò risulta nell'output seguente:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Puoi anche specificare gli indici dell'array, come numeri o stringhe:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
Che restituisce questo risultato:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Questa tecnica può essere utilizzata per evitare loop di post-elaborazione $_POST
, rendendo il codice più snello e più conciso.