Mysql
 sql >> Database >  >> RDS >> Mysql

Qual è il modo più sicuro per aggiungere html/css/js a mysql?

Sì, MySQL può archiviare qualsiasi tipo di testo in modo tecnicamente sicuro. Ciò significa che MySQL salverà il testo così com'è e lo restituirà di nuovo senza perdere alcun dato.

Mysql non differisce tra il contenuto del testo, quindi non fa differenza se si tratta di codice HTML, CSS, JS o dell'ultima email dei tuoi amici.

Tuttavia, se emetti il ​​testo in un secondo momento, dovresti fare attenzione che non ci sia iniezione di codice indesiderata dopo aver estratto i dati da mysql. Ma in realtà non è correlato a MySQL.

Per rendere sql più sicuro, passa l'handle del database a mysql_real_escape_string o ancora meglio usa MySQLi e/o DOP e dichiarazioni preparate.

Il tuo codice

Il tuo codice sembra che tu stia cercando molto di impedire qualcosa, ma alla fine risulta piuttosto inutile:

function filter($data) {
$data = trim(htmlentities(strip_tags($data)));

if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data= strip_tags($data);

$data = mysql_real_escape_string($data);

return $data;}

Normalizza i dati prima di elaborarli

Prima di tutto dovresti cambiare la posizione del controllo per get_magic_quotes_gpc per normalizzare i dati su cui sta lavorando la funzione. Sarebbe ancora meglio se la tua applicazione non si basasse su di essa ma negasse semplicemente di funzionare se tale opzione è abilitata - vedi qui queste importanti informazioni a riguardo se ti interessa la sicurezza.

Ma per la sicurezza del tuo codice pubblicato, normalizziamo prima il valore di input nella funzione prima di elaborarlo ulteriormente. Questo viene fatto spostando il segno di spunta nella parte superiore della funzione.

function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes)
   {
     $data = stripslashes($data);
   }

   // normalize $data because of whitespace on beginning and end
   $data = trim($data);

   // strip tags
   $data = strip_tags($data);

   // replace characters with their HTML entitites
   $data = htmlentities($data);

   // mysql escape string    
   $data = mysql_real_escape_string($data);

   return $data;
 }

In questa funzione modificata, le virgolette magiche (che non dovresti usare) sono state spostate in cima. Ciò garantisce che, indipendentemente dall'attivazione o disattivazione di tale opzione, i dati verranno elaborati sempre allo stesso modo. La tua funzione non lo ha fatto, avrebbe creato risultati diversi per gli stessi dati passati. Quindi questo è stato risolto.

Altri problemi con la tua funzione

Anche la funzione ora sembra migliorata, ha ancora molti problemi. Ad esempio, non è chiaro cosa faccia effettivamente la funzione. Fa molte cose contemporaneamente e alcune sono contraddittorie:

  • Rimuove i tag HTML che indicano che $data non deve contenere HTML
  • Ma poi converti il ​​testo di $data contenere effettivamente entità HTML.

Quindi quali dovrebbero essere i dati? HTML o no? Non introduce maggiore sicurezza se le cose diventano poco chiare, perché ciò trarrà vantaggio dal fatto che gli errori entrino nel tuo programma e alla fine passino anche le tue precauzioni di sicurezza.

Quindi dovresti semplicemente buttare via il codice e considerare quanto segue:

  • Se l'input per la tua applicazione non è valido, non filtrarlo. Impedire invece l'ulteriore utilizzo di input non validi. Quindi hai bisogno di una funzione per convalidare l'input prima di farne uso.
  • Non modificare i dati solo perché pensi questo potrebbe rendere qualcosa di più sicuro. Invece cambia e codifica i dati dove è necessario e appropriato.
    • Fai in modo che la tua applicazione funzioni solo con le virgolette magiche disattivate. Affidarsi a questa funzione è altamente sconsigliato. E poi non c'è bisogno di controllarlo dappertutto nel tuo codice.
    • Per archiviare qualcosa in modo sicuro all'interno del database, esegui l'escape dei dati prima di utilizzarli solo nella query. Non in un altro luogo della tua domanda. Usa le dichiarazioni preparate per questo.
    • Non c'è bisogno di manipolare i dati prima di inserirli nel database se sono validi. Ma devi codificarlo correttamente quando lo emetti sulla pagina web . E solo lì un'applicazione sa in quale codifica deve essere. Non lo sai quando inserisci i dati nel database.

Quindi, se vuoi rendere il tuo codice più sicuro, non si tratta di inserire un sacco di funzioni su alcuni dati perché pensi che siano correlati alla sicurezza. In questo modo non rendi il tuo software più sicuro ma meno sicuro.

  1. Non fidarti mai dei dati degli utenti.
  2. Assicurati che i dati siano nel formato che ti serve prima dell'elaborazione .
  3. Utilizza lo strumento giusto per il lavoro al posto giusto.
  4. Non utilizzare mai strumenti per indovinare. Ottieni invece la conoscenza, che paga non solo dal punto di vista della sicurezza.