[PHP] Prevenire errori in fase di posting

Ultimamente mi trovo molto impegnato a codificare un sistema di gestione ordini. Ho scelto di programmare un’interfaccia web utilizzando il php come linguaggio di base, per far comunicare ed interagire l’utente con un database MySQL.

Come si potrà immaginare, in un software del genere, l’interazione utente <=> applicazione è tutt’altro che statica. L’utilizzatore finale è chiamato a riempire miriadi di form.
Una cosa sicura in questi casi è che l’utente sbaglierà! Errori spesso involontari, altre volte pilotati da un desiderio di far male all’applicazione. Sono ben note le vulnerabilità del linguaggio SQL e si sa che una variabile $_POST[‘qualcosa’] mal concepita può creare vari problemi all’applicazione, ed in certi casi recare danno alla vista stessa del database.
Altre volte può capitare che non sia la vita del database ad avere problemi, ma l’interazione applicazione <=> utente. Si pensi al caso in cui l’utente posti un testo che dopo dovrà visualizzare in formato HTML. Determinati caratteri, in codice HTML ed in funzione di un determinato charset devono avere un certo codice e spesso chi riempie il form non lo sa.

Il modo migliore per risolvere questi problemi è creare delle espressioni regolari. Flussi di controllo dove si impongono regole rigide alle variabili.
Spesso risulta però molto più facile, veloce e meno invasivo, pilotare di nascosto il posting. Modificare i caratteri *cattivi* che l’utente (consapevolmente o meno) scrive nei vari form che riempie.

Attraverso l’uso delle funzioni il PHP ci aiuta moltissimo: scriveremo una sola volta la funzione di replace dei caratteri. Dopo di che, sarà cura del coder applicarla dove necessario.

  function rimpiazza( $t = "" ){
     
      $trova[] = "&";
      $trova[] = "’";
      $trova[] = "’";
      $trova[] = "©";
      $trova[] = "®";
      $trova[] = "€";
      $trova[] = "à";
      $trova[] = "è";
      $trova[] = "é";
      $trova[] = "ì";
      $trova[] = "ò";
      $trova[] = "ù";
      $trova[] = ‘"’;
      $trova[] = "<";
      $trova[] = ">";
      $trova[] = "
";

      $rimpiazza[] = "&amp;";
      $rimpiazza[] = "&#8217;";
      $rimpiazza[] = "&#8217;";
      $rimpiazza[] = "&copy;";
      $rimpiazza[] = "&reg;";
      $rimpiazza[] = "&euro;";
      $rimpiazza[] = "&agrave;";
      $rimpiazza[] = "&egrave;";
      $rimpiazza[] = "&eacute;";
      $rimpiazza[] = "&igrave;";
      $rimpiazza[] = "&ograve;";
      $rimpiazza[] = "&ugrave;";
      $rimpiazza[] = "&quot;";
      $rimpiazza[] = "&lt;";
      $rimpiazza[] = "&gt;";
      $rimpiazza[] = "<br />";

      return str_replace($trova,$rimpiazza, $t);
  }

Ricordate che il PHP è un linguaggio interpretato *from top to bottom*. Per cui, il primo e l’ultimo elemento dell’array, dovranno sempre rimanere tali.

La funzione vi permette anche di potervene fregare se il vostro hoster, che non vi da accesso al php.ini, ha deciso (chissà poi per quale motivo) di impostare il magic_quotes_gpc in off. E’ cosa rara, ma c’è ancora chi persiste a mantenere la funzione disattivata.

Aggiungere nuove voci di rimpiazzo è facilissimo. E la funzione si presta anche per utilizzi ludici : - ) . Avete presente quei form in cui, a determinate corrispondenze di caratteri compiaiono le emoticons in posting? Spesso a volentieri il tutto è fatto con un semplice str_replace!

Sia chiaro che una funzioncina del genere, mai e poi mai potrà fare del vostro software un applicativo sicuro. Ma in modo facile, eviterete qualche problema…

NB: Il codice è applicabile tout court per software che usano il linguaggio XHTML 1.0 Transitional ed un charset iso-8859-1. Per charset o DOCTYPE diversi, parte dell’array potrebbe essere superfluo se non errato.
Regolatevi di conseguenza : - ) .

9 thoughts on “[PHP] Prevenire errori in fase di posting”

  1. Sisi, per alcuni caratteri il core del php mette a disposizione funzioni sue, migliori di questa, perchè hanno il parametro opzionale charset.

    Per quello che devo fare io preferisco racchiudere tutto in un unica funzione. In questo modo gestisco caratteri non supportati dalle funzioni del core, come ® ad esempio…
    Ed anche i break di riga.

    Ovvio che in caso di richiamo testo per modifica, per il break è giusto creare una funzione di ritorno: ovvero che modifichi i br in

  2. @donzo sul post sopra ti ho lasciato una richiesta di aiuto x dblog
    Spero tu capisca la domanda e io poi veda la risposta : -

  3. forse ho capito male ma io mi riferivo ai server e ai database che offrono a secondo che sia su piattaforma Window o linux.MySQL gira solo su linux?
    Mi sbaglio o mi confondo
    Se è OT scusa ho letto male.
    Ciao x ora

  4. Ho riletto meglio, sorry del c…o : -
    Ho sbagliato io e penso che a secondo del database si può implementare
    In questo caso tu parlavi di cosa hai fatto e come.
    Ciao

Comments are closed.