Quali sono le migliori pratiche di sicurezza per i plugin e i temi di WordPress? [chiuso]


22

Come suggerito in questa domanda , sto aggiungendo questo argomento come una nuova domanda, per la discussione / votazione della comunità in merito alle migliori pratiche per la sicurezza di plugin / temi.

Ecco l'elenco di controllo iniziale, basato sulle mie impostazioni (work-in-progress) correnti / elenco di controllo sulla sicurezza dei dati utilizzato per la revisione dei temi (i principi non dovrebbero essere diversi per i plugin rispetto a quelli dei temi).

Se vuoi dare un'occhiata a un tema con una pagina di impostazioni del tema sicura e ben codificata, dai un'occhiata a questo tema:
http://wordpress.org/extend/themes/coraline


Se qualcuno con i privilegi appropriati non ti dispiacerebbe fare di questo un wiki della community?
Chip Bennett,

Per ottenere una domanda in modalità wiki una mod deve taggare la domanda in modo appropriato , l'ho contrassegnata per l'attenzione della mod, è solo una questione di tempo ora .. :)
t31os

Cosa c'è di così speciale in Coraline? Imo ci sono ancora modi per entrare. Suggerirei di collegare anoni A insted: wordpress.stackexchange.com/questions/13539/…
kaiser

Potrebbe non esserci nulla di particolarmente speciale in Coraline. È semplicemente quello a cui attualmente indirizziamo gli sviluppatori di temi, durante la revisione di Temi, perché è stato l'esempio fornito da Justin Tadlock, che ha fatto molte delle prime revisioni tematiche specifiche per la sicurezza. Vorrei offrire anche l'enologia come buon esempio, ma non voglio imbattermi nel tentativo di modellare il mio tema. :)
Chip Bennett

Risposte:



12

Disinfetta, convalida e elimina i dati

Disinfetta tutto ciò che potrebbe entrare e uscire dal (!) Database sia front-end che back-end!

Plugin e temi dovrebbero eseguire una corretta convalida dei dati:

  1. Convalida e sanifica tutti i dati non attendibili prima di inserire i dati nel database
  2. Esci da tutti i dati non attendibili prima di essere emessi nei campi del modulo Impostazioni
  3. Esci da tutti i dati non attendibili prima di essere emessi nei file del modello del tema

Plugin e temi dovrebbero essere usati esc_attr()per input di testo e esc_html()o esc_textarea()per aree di testo.

Disponibile anche dalle API di WordPress è esc_url(), esc_url_raw(), esc_js()e wp_filter_kses().

Cattivo esempio:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Buon esempio:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Ecco un ottimo video di Mark Jaquith che spiega l'uso delle funzioni di escape:


3
Disinfetta mentre
entri

9

Usa solo $ _GET / $ _POST / $ _REQUEST solo quando non sono disponibili API migliori

Plugin e temi dovrebbero utilizzare l'API delle impostazioni per ottenere e salvare i dati di input del modulo anziché fare affidamento $_POSTe $_REQUESTdati direttamente.


3
Tratta sempre $ _POST, $ _REQUEST e $ _GET come non sicuri. Disinfetta e autorizza i valori di tali array e inseriscili nelle tue variabili. Non disinfettare mai i valori provenienti dall'utente e rimetterli in $ _POST.
goldenapples

2
Verificare sempre che la chiave che è necessario utilizzare sia impostata nella matrice appropriata. isset () è tuo amico :)
mfields

9

Uso $wpdb->prepare

Quando si creano query personalizzate tramite l' $wpdboggetto, utilizzare sempre $wpdb->prepareper riempire i segnaposto con valori invece di scrivere le query con dati miscelati con codice SQL, poiché le mysql_*funzioni della famiglia hanno erroneamente insegnato a tutti.


$wpdb->preparenon è lo stesso delle dichiarazioni preparate.
Hacre,

8

Fai attenzione alle funzioni PHP che potrebbero essere utilizzate per eseguire codice dannoso

Una buona lettura per chiunque scriva PHP: funzioni PHP sfruttabili su StackOverflow.

Usa l' API di modifica del tema

I temi dovrebbero usare set_theme_mod()e le funzioni correlate non uno schema di nomi auto inventato.
L'API theme_mod è un livello specializzato per l'API delle impostazioni; garantisce nomi univoci, inserisce tutte le opzioni in un array ed è - per la mia esperienza - molto più facile da gestire. Inoltre, offre filtri standardizzati per i plugin, il che è positivo per l'interoperabilità.

Evita abilitato register_globals

Non fare affidamento register_globals = on. Un tema Pro acquistato dal mio ultimo cliente fa esattamente questo. Potrei hackerare qualsiasi sito usando questo tema in 5 minuti ... Anche
ThimbThumb ha fatto questo (e lo fa ancora?).

Non creare file con autorizzazioni di accesso ampio non necessarie

Non creare file con autorizzazioni di accesso troppo libere.

Usa SSL dove disponibile

Punta la tua condivisione su Twitter / Facebook / qualsiasi link all'URI HTTPS, se disponibile. Anche la sicurezza del tuo lettore è importante.


2
Puoi approfondire set_theme_mod(), in particolare, come combinarlo correttamente con l'utilizzo dell'API delle impostazioni?
Chip Bennett,

@Chip Bennett Ho aggiunto alcune informazioni alla mia risposta.
fuxia

Puoi suddividere questo mini-elenco in risposte più specifiche più piccole? Gestione della wiki della community in blocchi più piccoli. TIA
Rarst

3
Chip: il sistema di modifica del tema non si integra troppo bene con l'API delle impostazioni. Scriverò un post in cui spiegherò come farlo bene presto.
Otto

7

Salva i dati in un singolo array

Plugin e temi dovrebbero salvare le opzioni in un singolo array, piuttosto che creare più opzioni per la pagina delle impostazioni. L'uso dell'API delle impostazioni lo gestirà.


6

Verificare la capacità appropriata durante l'aggiunta e la stampa delle pagine delle impostazioni

I plugin dovrebbero usare una capacità appropriata (ad es. manage_options) Per la possibilità di aggiungere la pagina delle impostazioni.

I temi devono utilizzare edit_theme_optionscome capacità appropriata per aggiungere la pagina delle impostazioni.


1
Nota piccola ma importante: non è possibile utilizzare edit_theme_optionscon l'API delle impostazioni, l'invio delle opzioni è codificato per richiedere l' manage_optionsinvio degli aggiornamenti. Il biglietto Trac correlato è disponibile qui .
t31os,

Vero, ma 1) che avrà un impatto solo sugli editori, non sugli amministratori; e 2) si spera che sarà presto risolto, tramite il biglietto Trac collegato.
Chip Bennett,

C'è sempre la possibilità che venga assegnato un edit_theme_optionslimite a un ruolo personalizzato oa un ruolo regolare , ho pensato che potrebbe essere utile sottolineare che l'API delle impostazioni nello stato corrente è utilizzabile solo dai ruoli con manage_optionscapacità.
t31os,

5

Usa tutorial e informazioni aggiornati

Plugin e temi dovrebbero implementare deliberatamente le pagine Opzioni e Impostazioni e non fare affidamento su esercitazioni su siti Web copia e incolla che sono obsolete e non includono un'adeguata sicurezza dei dati, come quelle elencate di seguito.

Esempi di cosa non fare :


1
Ho aggiunto un po 'di testo enfatizzato per indicare che i collegamenti sono esempi di cosa non fare, in quanto è facile scorrere le informazioni e fare clic sui collegamenti senza leggere il paragrafo che li precede. Anche reso la risposta un po 'più carina mentre ero lì ...;)
t31os

2
Questo potrebbe usare un po 'di spiegazioni su cosa stanno facendo esattamente i tutorial di esempio in un modo sbagliato e / o vecchio.
Rarst

4

Usa l'API delle impostazioni

Plugin e temi dovrebbero usare l'API delle impostazioni, che è più facile da usare, più sicura e si occupa di gran parte del duro lavoro delle pagine delle impostazioni:

Per una buona esercitazione sull'uso dell'API delle impostazioni, vedere:


Vedi il mio commento su questa risposta per quanto riguarda l'API delle impostazioni e le opzioni del tema.
t31os,

1

Per le caselle di controllo e selezionare le opzioni, Plugin e Temi dovrebbero usare le funzioni checked()e selected()per l'output checked="checked"e selected="selected", rispettivamente.


Non è davvero una cosa di sicurezza, a meno che non mi manchi qualcosa. Ancora molto conveniente e buono da usare. :)
Rarst

Bene, forse e forse no. Ho visto MOLTO codice personalizzato per realizzare la stessa cosa. Più spaghetti al codice = maggiori opportunità di introdurre rischi per la sicurezza. :)
Chip Bennett

Bennet - dalla posta con toscho qualche giorno fa - immagino di poterlo dire per entrambi - le funzioni più semplici per questo sono molto più facili da leggere e capire di quelle funzioni. Non sono down-, ma non lo faccio anche io. Imo questo non dovrebbe far parte del core, in quanto non aggiunge alcun valore.
Kaiser

2
Sono curioso di sapere cosa abbiate trovato più facile di checked( $theme_options['whatever_option'] )o checked( 'some_value' == $theme_options['whatever_option'] ). Non so come sia più succinto di così?
Chip Bennett

1

Prefisso funzione e nomi delle variabili

I plugin dovrebbero precedere tutte le opzioni, funzioni personalizzate, variabili personalizzate e costanti personalizzate con plug-slug.

I temi dovrebbero precedere tutte le opzioni, le funzioni personalizzate, le variabili personalizzate e le costanti personalizzate con il tema-lumaca.


Vorrei estenderlo a tutti i nomi di classe e ai nomi di oggetti personalizzati come post_types e tassonomie.
mfields,


0

Aggiungi le pagine delle impostazioni alle sezioni appropriate del menu di amministrazione

I plug-in dovrebbero usare la add_options_page()funzione per aggiungere la pagina delle impostazioni del plug-in al Settingsmenu, anziché utilizzare add_menu_page()per aggiungere un menu di livello superiore.

I temi devono utilizzare la add_theme_page()funzione per aggiungere la pagina delle impostazioni del tema al Appearancemenu, anziché utilizzare add_menu_page()per aggiungere un menu di livello superiore.

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.