In realtà sono un ingegnere di VIP che fa molta revisione del codice :) Contrassegno un sacco di scappare.
ma non sfugge all'output
Non proprio, non sfugge all'output, il che è sorprendente per la maggior parte delle persone. Questo perché se sei un super amministratore hai le unfiltered_html
capacità, quindi non può sfuggire all'output. Invece lo esegue wp_kses_post
su input. Idealmente dovresti rimuovere quella funzionalità però.
Ecco l'implementazione al momento attuale:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
Il meccanismo ideale per sfuggire a tutto ciò che passa attraverso il the_content
filtro d'altra parte è:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
In questo modo rendiamo il contenuto sicuro, quindi lo eseguiamo attraverso il filtro, evitando che vengano rimossi gli incorporamenti, ecc.
Quindi perché scappare
Il punto di fuga è generare HTML valido, la maggiore sicurezza che fornisce è solo un piacevole effetto collaterale.
Per impedire agli utenti di rompere accidentalmente il markup
Ci sono molte ragioni per scappare, ma fondamentalmente stai facendo rispettare le aspettative. Prendi il seguente codice:
<a href="<?=$url?>">
Ci aspettiamo $url
di contenere un URL adatto ad un href
attributo, ma cosa succede se non lo è? Bene, perché lasciarlo al caso, imponiamolo:
<a href="<?=esc_url( $url )?>">
Ora sarà sempre un URL. Non importa se un hacker inserisce un'immagine $url
o se un utente digita nel campo sbagliato o se esiste uno script dannoso. Sarà sempre un URL valido perché abbiamo detto che sarà un URL. Certo potrebbe essere un URL molto strano, ma soddisferà sempre l'aspettativa che un URL sia presente. È molto utile, sia per la convalida del markup, per la sicurezza, ecc
Detto questo, fuggire non è validazione, fuggire non è sanificazione. Questi sono passaggi separati che avvengono in diversi punti del ciclo di vita. La fuga obbliga le cose a soddisfare le aspettative, anche se le fa impazzire.
A volte mi piace pensare di scappare come uno di quei giochi giapponesi con il gigantesco muro di schiuma con il taglio. I concorrenti devono adattarsi alla forma del cane o vengono scartati, solo per i nostri scopi ci sono laser e coltelli attorno al buco. Qualunque cosa rimanga alla fine sarà a forma di cane, e sarà spietata e severa se non sei già a forma di cane.
Ricorda:
- disinfettare presto
- convalidare in anticipo
- scappare tardi
- scappare spesso
La sicurezza è un passaggio multiplo, strato di difesa a più livelli, la fuga è uno degli strati esterni di difesa in uscita. Può manipolare il codice di attacco su un sito compromesso rendendolo inutile, contrastare gli exploit aperti e assicurarsi che il tuo client non rompa un sito inserendo i tag in un campo che non dovrebbero. Non è un sostituto per le altre cose, ed è di gran lunga lo strumento di sicurezza più sottoutilizzato in un manuale per gli sviluppatori.
Quanto al perché scappare se the_content
non lo fa? Se hai un diluvio in arrivo, e 5 buchi in un muro, ma solo il tempo per sistemare 3, fai spallucce e non aggiusti nessuno? O mitighi il rischio e riduci l'area di attacco?
Forse posso aiutarti a correggere quelle ultime 2 buche con questo frammento:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Qui impostiamo la priorità sul numero più alto possibile in PHP, quindi aggiungiamo 1 in modo che trabocchi al numero più basso possibile che può essere rappresentato. In questo modo tutte le chiamate a the_content
sfuggiranno al valore prima di qualsiasi altro filtro. In questo modo gli incorporamenti ecc funzionano ancora, ma gli utenti non possono intrufolarsi in HTML pericoloso tramite il database. Inoltre, cerca di rimuovere la unfiltered_html
funzionalità da tutti i ruoli
wp_kses_post