WordPress è open source, il che significa che tutti, compresi gli hacker con intenzioni malevole, possono setacciare il codice sorgente alla ricerca di buchi nella sua sicurezza. In questa serie di esercitazioni, esamineremo il processo di creazione di un plug-in di WordPress per rilevare e correggere eventuali difetti di sicurezza che potrebbero trovarsi nell'installazione di WordPress..
Vai avanti e crea una nuova cartella nella tua directory dei plugin chiamata sicuro
, quindi creare un file chiamato safe.php
dentro. Le prime righe di codice per un plugin stanno solo dicendo a WordPress che si tratta di un plug-in, di ciò che viene chiamato e di altre informazioni di tale natura. Questa sezione è simile ai metadati di un tema o modello.
/ * Nome plugin: URI plugin sicuro: http://wp.tutsplus.com Descrizione: il modo più semplice ed efficace per proteggere il tuo sito WordPress dagli aggressori. Autore: Fouad Matin Versione: 1.0 Autore URI: http://wp.tutsplus.com/author/fouad * /
Aggiornamento: come da commento di Christopher qui sotto, non c'è più bisogno di definire WP_CONTENT_URL
, WP_CONTENT_DIR
, WP_PLUGIN_URL
, e WP_PLUGIN_DIR
come WordPress li definisce per noi nel file includes / default-constants.php
.
Successivamente dobbiamo mettere in atto alcuni hook di azione, che sono funzioni attivate dopo un determinato evento, come ad esempio admin_menu
funzione chiamata. Le azioni vengono in genere utilizzate per modificare i dati del database, i messaggi e-mail e modificare ciò che viene visualizzato sullo schermo. I filtri, d'altra parte, sono hook che vengono lanciati prima di eseguire il rendering del testo o l'invio di dati. Puoi anche rimuovere azioni se vuoi, come ad esempio wp_generator
funzione.
remove_action ('wp_head', 'wp_generator');
Innanzitutto, prima di aggiungere il nostro testo al plug-in, intendiamo essenzialmente incorporare un foglio di stile usando il wp_enqueue_style
funzione. Questa funzione è solo un modo sicuro per aggiungere file CSS a una pagina generata da WordPress. Per ulteriori informazioni sull'aggitazione, consulta il tutorial di Japh sull'inclusione di javascript e css.
add_action ( 'admin_enqueue_scripts', 'safe_styles'); function safe_styles () wp_enqueue_style ('safe_style', plugins_url ('/ css / safe.css', __FILE__));
Ora, per consentire all'utente di aprire la pagina dei plug-in, è necessario aggiungere una pagina di menu per il nostro plug-in. Inoltre, il plugin di sicurezza dovrebbe essere disponibile solo per gli amministratori (puoi modificarlo se vuoi).
add_action ('admin_menu', 'add_menu_bpg'); function add_menu_bpg () if (! current_user_can ('administrator')) return false; if (function_exists ('add_menu_page')) add_menu_page ('Safe', 'Safe', 'edit_pages', 'safe-admin-page', 'safe_main', WP_PLUGIN_URL. '/ safe / img / safe.png') ;
Per visualizzare le informazioni sulla pagina del plugin, utilizziamo i metabox per renderlo coerente con il tema di amministrazione di WordPress. Vogliamo visualizzare le informazioni sul sistema / sul server e anche eseguire alcuni controlli di sicurezza rapidi e di base.
function safe_meta_box () ?>Ora, controlliamo se c'è un account con l'impostazione predefinita di Admin che è la prima ipotesi della maggior parte degli hacker e quindi un modo semplice per entrare nel tuo pannello di amministrazione. Inoltre, ti consiglio di configurare un file .htaccess nel tuo
wp-admin
directory che blocca tutti gli indirizzi IP diversi dal tuo. Nel nostro prossimo articolo, imposteremo un modo per configurare l'htaccess dalla pagina del plugin.globale $ wpdb; eco 'WP ID Tag META rimosso dal core WordPress'; eco ''; $ name = $ wpdb-> get_var ("SELECT user_login FROM $ wpdb-> users WHERE user_login =" admin ""); if ($ name == "admin") echo 'L'utente "admin" esiste.'; else echo 'Nessun utente "admin".'; eco ''; eco ''; if (file_exists ('. htaccess')) echo '.file htaccess trovato in wp-admin /'; else echo 'Il file .htaccess non esiste nella sezione di wp-admin.'; eco ''; ?>Aggiungiamo un'altra colonna / riquadro per il lato destro dello schermo, dove possiamo visualizzare tutte le informazioni e le impostazioni del server.
function safe_meta_box2 () ?>
Solo per scopi organizzativi, crea una nuova directory chiamata inc
dentro il tuo sicuro
directory, dove creerai un file chiamato functions.php
per mantenere le nostre funzioni principali. Queste funzioni saranno responsabili dell'esecuzione dei test, del controllo delle autorizzazioni dei file, delle impostazioni del database, ecc. È meglio separarli dal file del plugin principale in modo che sia più facile navigare e leggere.
Innanzitutto, iniziare iniziando una connessione al database e recuperando la versione MySQL e l'array di informazioni MySQL. Controlliamo anche se la modalità sicura PHP è attivata, poiché potrebbe causare mal di testa con altri plug-in e impostazioni.
function safe_get_serverinfo () global $ wpdb; $ sqlversion = $ wpdb-> get_var ("SELECT VERSION () AS version"); $ mysqlinfo = $ wpdb-> get_results ("MOSTRA VARIABILI LIKE 'sql_mode'"); if (is_array ($ mysqlinfo)) $ sql_mode = $ mysqlinfo [0] -> Valore; if (vuoto ($ sql_mode)) $ sql_mode = __ ('Non impostato'); $ sm = ini_get ('safe_mode'); if (strcasecmp ('On', $ sm) == 0) $ safe_mode = __ ('On'); else $ safe_mode = __ ('Off');
Per accettare i pingback in arrivo, allow_url_fopen
deve essere impostato su "on" nel tuo php.ini. Tuttavia, rende anche il codice suscettibile all'iniezione del codice, perché il file_get_contents ()
può recuperare dati da posizioni remote come un server FTP o web.
if (ini_get ('allow_url_fopen')) $ allow_url_fopen = __ ('On'); else $ allow_url_fopen = __ ('Off');
Limiti di memoria e tempi di esecuzione avranno un ruolo importante nella prossima parte del tutorial per il plugin per suggerire possibili soluzioni ai difetti di sicurezza tenendo conto dei limiti del sistema.
if (ini_get ('upload_max_filesize')) $ upload_max = ini_get ('upload_max_filesize'); else $ upload_max = __ ('N / A'); if (ini_get ('post_max_size')) $ post_max = ini_get ('post_max_size'); else $ post_max = __ ('N / A'); if (ini_get ('max_execution_time')) $ max_execute = ini_get ('max_execution_time'); else $ max_execute = __ ('N / A'); if (ini_get ('memory_limit')) $ memory_limit = ini_get ('memory_limit'); else $ memory_limit = __ ('N / A'); if (function_exists ('memory_get_usage')) $ memory_usage = round (memory_get_usage () / 1024/1024, 2). __ ('MByte'); else $ memory_usage = __ ('N / A'); if (is_callable ('exif_read_data')) $ exif = __ ('Sì'). "(V". Substr (phpversion ('exif'), 0,4). ")"; else $ exif = __ ('No'); if (is_callable ('iptcparse')) $ iptc = __ ('Sì'); else $ iptc = __ ('No'); if (is_callable ('xml_parser_create')) $ xml = __ ('Sì'); else $ xml = __ ('No');
Ora, sputiamo tutti i dati che abbiamo appena raccolto sul server.
?>
Un altro difetto importante nella maggior parte delle installazioni di WordPress generiche è l'uso del prefisso di tabella predefinito: wp_
. Nel nostro prossimo articolo, imposteremo un modo per fare il backup e rinominare le tabelle in cui si trova il safe_check_table_prefix
e safe_errorsoff
le funzioni entreranno in gioco.
function safe_check_table_prefix () if ($ GLOBALS ['table_prefix'] == 'wp_') echo 'Il prefisso del tuo tavolo non dovrebbe essere wp_.
'; else echo 'Il prefisso della tabella non lo è wp_.
'; function safe_errorsoff () echo 'Errori DB WordPress disattivati.
';
Se hai una versione precedente di WordPress, quindi prima l'aggiornamento. Indipendentemente da quanto sei bravo a tenere traccia degli aggiornamenti, c'è sempre la possibilità che tu possa rimanere indietro. Una volta che i difetti di sicurezza di una versione precedente sono elencati nel registro delle modifiche per la nuova versione, la sicurezza dell'installazione è ora compromessa. La maggior parte dei temi lo fa per impostazione predefinita, ma per sicurezza, lo abbiamo rimosso prima usando il remove_action
filtro e ora ci assicureremo che anche l'utente finale lo sappia.
function safe_version_removal () global $ wp_version; eco 'La tua versione di WordPress è nascosta con successo.
'; function safe_check_version () $ c = get_site_transient ('update_core'); if (is_object ($ c)) if (vuoto ($ c-> updates)) echo ''.__ (' Hai l'ultima versione di Wordpress. ').''; ritorno; if (! empty ($ c-> updates [0])) $ c = $ c-> updates [0]; if (! isset ($ c-> response) || 'latest' == $ c-> response) echo ''.__ (' Hai l'ultima versione di Wordpress. ').''; ritorno; if ('upgrade' == $ c-> response) $ lv = $ c-> current; $ m = ''.Sprintf (' Wordpress (%S) è disponibile. Dovresti eseguire l'upgrade all'ultima versione. ', $ Lv).''; echo __ ($ m); ritorno; eco ''.__ (' Si è verificato un errore durante il tentativo di recuperare lo stato della versione di Wordpress. ').'';
Con le versioni più recenti di WordPress, la sicurezza di wp-config.php
non dovrebbe essere un problema, ma è meglio prevenire che curare. Se qualcuno con intenti malevoli dovesse mettere le mani sul tuo wp-config.php
, potrebbero accedere alle credenziali di accesso al database, alle chiavi di autorizzazione e ai sali del database. Verificheremo se possiamo ottenere il file, scrivere sul file o se esiste in quella directory. Se lo fa, mostreremo un avviso urgente e, nel nostro prossimo articolo, un metodo per risolvere facilmente il problema.
function safe_wpConfigCheckPermissions ($ wpConfigFilePath) if (! is_writable ($ wpConfigFilePath)) echo ''.__ (' Il tuo file di configurazione wp non è una minaccia. ').''; restituisce falso; if (! function_exists ('file') ||! function_exists ('file_get_contents') ||! function_exists ('file_put_contents')) echo ''.__ (' Il tuo file di configurazione wp non è una minaccia. ').''; restituisce falso; else echo ''.__ (' Il tuo file di configurazione di wp può essere compromesso dagli hacker, correggere i permessi. ').''; ritorna vero;
Ora, dobbiamo tornare al safe.php
file e aggiungi il nostro nuovo functions.php
, sopra l'azione e i ganci del filtro.
require_once (WP_PLUGIN_DIR. "/safe/inc/functions.php");
Ritorno al safe.php
, l'ultima aggiunta è il safe_main ()
funzione che viene chiamata quando viene caricata la pagina. Qui abbiamo bisogno di aggiungere i metabox che abbiamo definito prima e aggiungere un po 'di stile.
function safe_main () add_meta_box ("safe_box_1", "Basic Checks", "safe_meta_box", "box1"); add_meta_box ("safe_box_2", "Informazioni di sistema", "safe_meta_box2", "box2"); eco '';'; do_meta_boxes ('box1', 'advanced', "); echo ''; do_meta_boxes ('box2', 'advanced', "); echo '
Infine, crea un file CSS chiamato safe.css
in una directory chiamata css
sotto il nostro sicuro
directory. Puoi modellare le caselle come vuoi, oppure puoi semplicemente usare il seguente codice CSS per il testo di errore e di successo:
div.pass, span.pass color: # 7AB317; div.fail, span.fail color: # ff3333; div.fail, span.fail a color: # ff3333;
A questo punto dovresti sapere come aggiungere una pagina di menu per il tuo plug-in, applicare azioni e filtri hook e controllare in modo programmato eventuali difetti di sicurezza in WordPress.
Se hai ulteriori suggerimenti o domande riguardanti i plugin di sicurezza, sentiti libero di lasciare un commento! Inoltre, questo plugin è su GitHub, quindi vai avanti, forchetta il repository e personalizzalo come vuoi.
Aggiornamento: questo articolo è stato aggiornato secondo i suggerimenti di Christopher qui sotto.