Voglio assicurarmi che tutti i dati nei miei plugin / temi siano gestiti in modo sicuro prima di accedere al database e prima di essere inviati al browser. Il mio problema è che ci sono situazioni in cui l'API gestisce la sanificazione per te - come quando si salvano i meta-campi post - e altre in cui l'autore del plugin / tema è interamente responsabile per farlo - come quando si salvano le impostazioni personalizzate.
Ai fini di questa domanda, non sono preoccupato per la convalida dei dati a livello di dominio, ad esempio per verificare che un campo Età su un modulo sia compreso tra 0 e 120 o che un indirizzo e-mail sia valido. Sono preoccupato solo per la sicurezza - ad esempio, evitare le query SQL per evitare l'iniezione di SQL durante il salvataggio nel database o sanificare i dati che vengono generati in modelli HTML per evitare XSS.
Per la sanificazione dell'output, so che è sempre necessario utilizzare funzioni come esc_html()
e esc_attr()
quando si fa eco alle variabili nei modelli HTML. Ma che dire quando si utilizzano i tag modello ? Disinfettano già tutti l'output? In tal caso, per quale contesto (HTML generale, attributi di tag, ecc.)? Alcune funzioni hanno varianti per contesti diversi (come the_title_attribute()
, ma la maggior parte no.
Per la sanificazione dell'input, so che è necessario utilizzare $wpdb->prepare()
quando si eseguono query manuali, ma cosa succede quando si utilizza l'API delle impostazioni per creare una pagina delle impostazioni del plug-in o si salvano i metadati post per un tipo di post personalizzato?
In questo momento sto solo scavando attraverso Core e leggendo tutorial ogni volta che uso una funzione per scoprire se disinfetta o no, ma è soggetto a errori e richiede tempo. Spero di trovare una sorta di elenco completo di tutte le possibili situazioni e se l'API lo gestisce o meno. per esempio,
API convalida / sanifica
- Salvataggio della meta post con
update_postmeta()
- Salvataggio della meta utente con
update_user_meta()
- Emissione del titolo di un post: utilizzare la variante contestualmente appropriata di
the_title()
- eccetera
Devi convalidare / disinfettare manualmente
- Salvataggio delle opzioni del plug-in con l'API delle impostazioni. Passa una richiamata come terzo parametro di
register_setting()
. - Query dirette sul database: avvolgere la query
$wpdb->prepare()
. - Emissione di variabili in HTML. Usa
esc_attr()
,esc_html()
ecc - eccetera
Sarei anche interessato a capire perché l'API lo fornisce in determinate situazioni, ma non in altre. Suppongo che abbia qualcosa a che fare con la natura sconosciuta dei dati, ma mi piacerebbe sentire una spiegazione approfondita.
the_title()
, the_permalink()
ecc.), Si sta bene, ma con i dati personalizzati non lo si è (ad es get_post_meta()
.). In caso di dubbio, disinfetta te stesso - non può far male.