dubbi urlencode, sua utilità, dubbi sui dati che passano al suo interno

ciao, ho questa funzione che fa parte di un codice per la cancellazione dati in un form

function elimina_record($ids)
            {
               if(count($ids) < 1)
               {
                  $messaggio = urlencode("Nessuna voce selezionata!");
                  header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);
                  exit;
               }
               
               // per precauzione converto gli ID in interi
               $ids = array_map('intval',$ids);
               
               // creo una lista di ID per la query
               $ids = implode(',',$ids);
               
               // preparo la query
               $sql = "DELETE FROM circolari WHERE id IN ($ids)";
               
               // invio la query
               $result = mysql_query($sql);
               
               // controllo l'esito
               if (!$result) {
                  die("Errore nella query $sql: " . mysql_error());
               }
                 if ($result)
               {
                  echo 'Sono stati cancellati con successo i seguenti temi:<br />$ids';
               }
               // conto il numero di record cancellati
               $num_record = mysql_affected_rows();
               
               // chiudo la connessione a MySQL
               mysql_close($link);
               
               $messaggio = urlencode("Numero voci cancellate: $num_record");
               header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);
            }

mi chiedevo qual è l'utilità di urlencode e cosa comporta il fatto che veda nella barra URL quel messaggio (o forse è meglio dire a cosa serve....) posso far si magari che quel messaggio che passa nella barra degli indirizzi venga invece stampato a schermo?

grazie

inviato 9 anni fa
gabar-el
X 0 X

Come sai, in un uri possono essere inseriti qualsiasi tipo di caratteri, questi poi vengono codificati nel loro corrispondente valore, una specie di entità carattere per URI, a seconda di una data RFC che francamente ora non ricordo dove cercarla.

Ora se tu passi dei valori tramite URI, mettiamo tramite una GET, codificare la stringa tramite la funzione urlencode() ti può mettere al riparo da codice arbitrario che chiunque può inserire modificando ,ad esempio, i link della pagina o direttamente URI nella barra del browser.

Infatti dalla pagina del manuale si legge:

Valori restituiti

Returns a string in which all non-alphanumeric characters except -_. have been replaced with a percent (%) sign followed by two hex digits and spaces encoded as plus (+) signs. It is encoded the same way that the posted data from a WWW form is encoded, that is the same way as in application/x-www-form-urlencoded media type. This differs from the » RFC 1738 encoding (see rawurlencode()) in that for historical reasons, spaces are encoded as plus (+) signs.

A dire la verità alla fine della frase dice di vedere anche la funzione rawurlencode() e io sono andato a vederla subito :)

Valori restituiti

Returns a string in which all non-alphanumeric characters except -_. have been replaced with a percent (%) sign followed by two hex digits. This is the encoding described in » RFC 1738 for protecting literal characters from being interpreted as special URL delimiters, and for protecting URLs from being mangled by transmission media with character conversions (like some email systems).

E se non leggo male mi pare che sia ancora meno permissiva della prima, inoltre mi da pure l'indirizzo della RFC relativa ai caratteri ammessi in un URI e alla loro codifica: http://www.faqs.org/rfcs/rfc1738 tra l'altro è davvero esaustiva, direi anche troppo :)

Insomma queste funzioni ti servono per assicurarti un pezzo di paradiso dove le iniezioni di SQL sono più rare.

risposto 9 anni fa
Marco Grazia
X 0 X

ok, ho capito, grazie!

mi rimane ancora il dubbio di dove debba inserire gli echo per far apparire dei messagi di conferma....

grazie

risposto 9 anni fa
gabar-el
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda