Sanificazione dei dati: best practice con esempi di codice


15

Sto cercando di comprendere la sanificazione dei dati (non la convalida dei dati) per aiutarmi a scrivere temi sicuri per WordPress. Ho cercato su Internet cercando di trovare una guida completa per gli sviluppatori di temi che descrivesse le migliori pratiche. C'erano un paio di risorse che ho trovato tra cui la pagina del codice intitolata Data Validation, anche se nessuna mi è stata utile. La pagina del codice elenca le funzioni di sanificazione disponibili, il loro utilizzo e ciò che fanno, ma non spiega il motivo per cui dovresti usare l'uno sull'altro o in quale situazione utilizzeresti una particolare funzione di sanificazione. Lo scopo di questo post è di chiedere a tutti di contribuire con esempi di codice errato / non autenticato e come dovrebbe essere riscritto per una corretta sanificazione. Questo potrebbe essere un codice generale per sanificare il titolo del post o post thumnails src o codici più elaborati che gestiscono la sanificazione di$_POST dati per richieste Ajax.

Inoltre, vorrei sapere se le funzioni di WordPress per l'aggiunta / l'aggiornamento del database (ad esempio quelle menzionate nel blocco di codice in basso) si occupano automaticamente del lavoro di sanificazione per te? Se sì, allora ci sono delle eccezioni quando si adotteranno misure aggiuntive per sanificare i dati inviati a queste funzioni di WordPress?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Inoltre, la sanificazione deve essere eseguita in modo diverso quando si fa eco a HTML in PHP rispetto a PHP in linea di HTML? Per essere più chiari di ciò che sto chiedendo, ecco il codice:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Entrambe le affermazioni di cui sopra ottengono la stessa cosa. Ma devono essere santificati diversamente?


1
Potrebbe essere utile se sapessimo cosa stavi cercando di disinfettare. I temi sono per la presentazione dei dati ... devi solo disinfettare i dati che l'utente ti sta inviando e gli invii sono generalmente gestiti dai plugin.
EAMann,

@EAMann Le funzioni di escape come esc_attr, esc_html ecc. Sono create per sfuggire all'output. Correggimi se sbaglio. Presentare i dati significa che stai trasmettendo dati, quindi è necessario scappare anche all'interno dei temi. Altrimenti non ci sarebbe stata la necessità delle funzioni esc. Voglio capire la disinfezione dei temi di WordPress nel loro insieme e non si limita alla sanificazione di uno o due frammenti di codice.
John,

"Presentare i dati significa che stai trasmettendo dati, quindi è necessario scappare anche all'interno dei temi" - no. Ancora una volta, devi solo sfuggire ai dati di cui non ti fidi
onetrickpony,

@OneTrickPony Mi sta diventando più chiaro. Giusto per essere assolutamente sicuro di capirlo - Eviterei il contenuto del commento ma non sfuggirei all'ID del commento o all'ID del post, se dovessi generare questi in HTML. Ci dispiace, per disturbarti davvero con le domande una dopo l'altra.
Giovanni,

2
"Devi solo sfuggire ai dati di cui non ti fidi" - Sono completamente d'accordo. L'unica cosa che aggiungerei è che non dovresti mai fidarti dei dati;)
Ian Dunn,

Risposte:


12

Questa pagina del codice lo spiega abbastanza bene, credo.

La funzione più importante e comunemente usata è probabilmente esc_attr. Prendi questo esempio:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Se $author_namecontiene un "personaggio, il tuo attributo viene chiuso e se quel personaggio è seguito onclick="do_something();"potrebbe peggiorare :)

Fare print esc_attr($author_name)assicura che tali caratteri siano codificati e che il browser non faccia cose che non dovrebbe fare.

C'è un caso in cui non è necessario: quando ti aspetti un numero, nel qual caso puoi semplicemente trasmettere i dati di input in numeri interi, ad esempio:

print (int)$_POST['some_number'];


Le funzioni meta * che hai elencato qui si occupano già di disinfettare l'input per l'archiviazione del database, quindi non devi preoccuparti di questo.

Il wpdb->prepare()metodo deve essere utilizzato quando si eseguono le query del database da soli. Ecco un esempio:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

Le parole chiave %se %dverranno sostituite con i valori sterilizzati $ _POST.

Un errore molto comune che vedo in molti plug-in nel repository WP.org è passare una query già preparata (e mal preparata), come:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Non farlo :)

Inoltre, la sanificazione deve essere eseguita in modo diverso quando si fa eco a HTML in PHP rispetto a PHP in linea di HTML?

Entrambe le affermazioni di cui sopra ottengono la stessa cosa. Ma devono essere santificati diversamente?

No.


Grazie per i tuoi input. La tua spiegazione rende le cose più chiare per me.
John

È necessario un piccolo chiarimento. Se passo una stringa in una var (es. $ Var = 'string';) all'interno di PHP e la faccio eco come un attributo HTML, devo disinfettare $ var quando faccio eco. O è necessario sanitizzare solo se ho estratto il valore di $ var dal database.
John

Quando si fa eco sullo schermo, in un modo o nell'altro
onetrickpony

Quindi, se ti ho capito correttamente, se ho passato la stringa in $ var all'interno del codice PHP o se ho estratto i dati dal database e passato in $ var, entrambi mi richiedono di esc l'output. Corretta?
Giovanni

Sì, se tali dati provengono da input dell'utente, come ad esempio il nome dell'autore di un commento. Se per "passato la stringa in $ var all'interno del codice PHP" intendi che hai assegnato un valore che conosci a una variabile, allora ovviamente - no, non devi disinfettare quella variabile
onetrickpony l'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.