Il secondo consiglio per mettere in sicurezza WordPress è di per sé molto semplice: non eseguire più installazioni di WordPress sullo stesso database e proteggilo da occhi indiscreti. Se ci pensi, se qualcuno mai dovesse accedere al tuo database, otterrebbe istantaneamente l’accesso a tutti i tuoi siti web. Puoi trovare questa raccomandazione anche nel codex ufficiale di WordPress.
Attenzione non stiamo parlando di WordPress Multisite perché quello è costituito da un’installazione WP singola.
Perché non cambiare l’ID Amministratore nel Database?
Nel post precedente di questa serie abbiamo modificato e reso nascosto il login dell’amministratore. Ma per quanto riguarda l’ID? Tutti sanno che l’amministratore principale è l’utente con ID = 1.
Quindi, mi sento davvero a disagio pensando al fatto che ID amministratore è 1. Molte delle SQL injection si basano su questo principio. Quindi, apriamo phpMyAdmin ed eseguiamo le seguenti query (si consiglia vivamente di eseguire backup prima di apportare modifiche).
1. UPDATE wp_users SET ID = 5487 WHERE ID = 1; 2. UPDATE wp_posts SET post_author = 5487 WHERE post_author = 1; 3. UPDATE wp_comments SET user_id = 5487 WHERE user_id = 1; 4. UPDATE wp_usermeta SET user_id = 5487 WHERE user_id = 1; 5. ALTER TABLE wp_users AUTO_INCREMENT = 5488
Potete ovviamente cambiare il numero 5487 e 5488 in altri numeri per vostra sicurezza, l’importante è che siano consecutivi (es. 301-302, …)
Il codice sopra funziona bene per qualsiasi WordPress. Per il multisito devi duplicare le righe 2,3 per ogni sito della rete in questo modo:
PDATE wp_2_posts SET post_author = 5487 WHERE post_author = 1; UPDATE wp_2_comments SET user_id = 5487 WHERE user_id = 1;
Ma cosa succede se nel tuo multisito hai centinaia di blog? Bene, penso che in quel caso potresti eseguire le query in loop usando PHP e $wpdb.
Queste modifiche non influenzeranno le autorizzazioni di super amministratore, che sono collegate al tuo accesso.
Ovviamente cambieremo anche il prefisso del database
Suggerimento: fallo durante il processo di installazione di WordPress, in modo tale da non dover cambiare in un secondo momento, vedi screenshot qui sotto:
E se fosse troppo tardi? Se WordPress è già installato, magari con WooCommerce e anche con l’installazione Multisite?
Il tuo sito web è pieno di contenuti e non puoi semplicemente reinstallarlo. Ma niente panico, ti veniamo in aiuto con dei passaggi facili facili.
Passaggio 1. wp-config.php
Apri il tuo file di configurazione wp-config.php (puoi trovarlo direttamente nella tua cartella di installazione di WordPress) trova la riga con il prefisso wp_ e cambiala con quello che vuoi.
$table_prefix = 'wp_hj87ka_';
Passaggio 2. Rinomina le tabelle del database predefinite e le chiavi in wp_options e wp_usermeta
Prima di tutto, rinomina tutte le tabelle del database WordPress predefinite.
RENAME TABLE wp_comments TO wp_hj87ka_comments; RENAME TABLE wp_commentmeta TO wp_hj87ka_commentmeta; RENAME TABLE wp_links TO wp_hj87ka_links; RENAME TABLE wp_options TO wp_hj87ka_options; RENAME TABLE wp_postmeta TO wp_hj87ka_postmeta; RENAME TABLE wp_posts TO wp_hj87ka_posts; RENAME TABLE wp_terms TO wp_hj87ka_terms; RENAME TABLE wp_termmeta TO wp_hj87ka_termmeta; RENAME TABLE wp_term_relationships TO wp_hj87ka_term_relationships; RENAME TABLE wp_term_taxonomy TO wp_hj87ka_term_taxonomy; RENAME TABLE wp_usermeta TO wp_hj87ka_usermeta; RENAME TABLE wp_users TO wp_hj87ka_users;
Secondo lancia una sostituzione di wp_usermeta
and wp_options
con rispettivamente wp_hj87ka_usermeta
e wp_hj87ka_options
.
UPDATE wp_hj87ka_options SET option_name = REPLACE(option_name, 'wp_', 'wp_hj87ka_') WHERE option_name LIKE 'wp_%'; UPDATE wp_hj87ka_usermeta SET meta_key = REPLACE(meta_key, 'wp_', 'wp_hj87ka_') WHERE meta_key LIKE 'wp_%';
Passaggio 3. Alcune query aggiuntive per WooCommerce
Ricordati che ogni plugin che usi può creare le proprie tabelle nel database. Devi rinominare anche queste tabelle. WooCommerce è un plug-in per lo shopping ampiamente utilizzato per WordPress, quindi ho deciso di menzionare le query in merito. Ma lo stesso discorso vale anche per altri plugin.
RENAME TABLE wp_woocommerce_api_keys TO wp_hj87ka_woocommerce_api_keys; RENAME TABLE wp_woocommerce_attribute_taxonomies TO wp_hj87ka_woocommerce_attribute_taxonomies; RENAME TABLE wp_woocommerce_downloadable_product_permissions TO wp_hj87ka_woocommerce_downloadable_product_permissions; RENAME TABLE wp_woocommerce_order_itemmeta TO wp_hj87ka_woocommerce_order_itemmeta; RENAME TABLE wp_woocommerce_order_items TO wp_hj87ka_woocommerce_order_items; RENAME TABLE wp_woocommerce_payment_tokenmeta TO wp_hj87ka_woocommerce_payment_tokenmeta; RENAME TABLE wp_woocommerce_payment_tokens TO wp_hj87ka_woocommerce_payment_tokens; RENAME TABLE wp_woocommerce_sessions TO wp_hj87ka_woocommerce_sessions; RENAME TABLE wp_woocommerce_shipping_zones TO wp_hj87ka_woocommerce_shipping_zones; RENAME TABLE wp_woocommerce_shipping_zone_locations TO wp_hj87ka_woocommerce_shipping_zone_locations; RENAME TABLE wp_woocommerce_shipping_zone_methods TO wp_hj87ka_woocommerce_shipping_zone_methods; RENAME TABLE wp_woocommerce_tax_rates TO wp_hj87ka_woocommerce_tax_rates; RENAME TABLE wp_woocommerce_tax_rate_locations TO wp_hj87ka_woocommerce_tax_rate_locations;
Passaggio 4. Ok, ma cosa succede se utilizzi WordPress Multisite?
Ovviamente continua lo stesso lavoro che abbiamo fatto per Woocmmerce
ENAME TABLE wp_blogs TO wp_hj87ka_blogs; RENAME TABLE wp_blog_versions TO wp_hj87ka_blog_versions; RENAME TABLE wp_registration_log TO wp_hj87ka_registration_log; RENAME TABLE wp_site TO wp_hj87ka_site; RENAME TABLE wp_signups TO wp_hj87ka_signups; RENAME TABLE wp_sitemeta TO wp_hj87ka_sitemeta;
Per ogni sito della rete ripetere le seguenti sostituzioni:
RENAME TABLE wp_2_comments TO wp_hj87ka_2_comments; RENAME TABLE wp_2_commentmeta TO wp_hj87ka_2_commentmeta; RENAME TABLE wp_2_links TO wp_hj87ka_2_links; UPDATE wp_2_options SET option_name = REPLACE(option_name, 'wp_', 'wp_hj87ka_') WHERE option_name LIKE 'wp_%'; RENAME TABLE wp_2_options TO wp_hj87ka_2_options; RENAME TABLE wp_2_postmeta TO wp_hj87ka_2_postmeta; RENAME TABLE wp_2_posts TO wp_hj87ka_2_posts; RENAME TABLE wp_2_terms TO wp_hj87ka_2_terms; RENAME TABLE wp_2_termmeta TO wp_hj87ka_2_termmeta; RENAME TABLE wp_2_term_relationships TO wp_hj87ka_2_term_relationships; RENAME TABLE wp_2_term_taxonomy TO wp_hj87ka_2_term_taxonomy;
Aggiungi qui le query WooCommerce per ogni sito della rete in cui è installato WooCommerce.
Passaggio 5. Alcune query aggiuntive per il tuo plug-in multisito
Se utilizzi questo plug-in per la tua rete multisito e ora desideri modificare il prefisso del database, non dimenticare di eseguire anche le seguenti query.
ENAME TABLE wp_network_log TO wp_hj87ka_network_log; RENAME TABLE wp_network_postmeta TO wp_hj87ka_network_postmeta; RENAME TABLE wp_network_posts TO wp_hj87ka_network_posts; RENAME TABLE wp_network_rebuildqueue TO wp_hj87ka_network_rebuildqueue; RENAME TABLE wp_network_terms TO wp_hj87ka_network_terms; RENAME TABLE wp_network_term_relationships TO wp_hj87ka_network_term_relationships; RENAME TABLE wp_network_term_taxonomy TO wp_hj87ka_network_term_taxonomy;
Così tanti passaggi … Ma penso che sia il tutorial più completo sulla modifica del prefisso del database 🙂
Il modo corretto di utilizzare le query SQL in WordPress per prevenire le iniezioni di SQL
Forse hai sentito che quasi tutti i problemi di sicurezza di WordPress derivano da temi e plugin scritti male. E quando crei il tuo plug-in o un tema puoi creare un potenziale buco di sicurezza, come una funzionalità di SQL injection. Ricorda questi semplici suggerimenti per restare protetto.
- Utilizza sempre
$wpdb
per connetterti a MySQL. - è fondamentale eseguire
$wpdb->query()
,$wpdb->get_col()
,$wpdb->get_var()
,$wpdb->get_row()
,$wpdb->get_results()
with$wpdb->prepare()
! - Allo stesso tempo, i comandi
$wpdb->insert()
,$wpdb->update()
,$wpdb->replace()
,$wpdb->delete()
non dovrebbero essere incrociati con$wpdb->prepare()
perché è già incluso all’interno.
L’esempio di $wpdb->get_results()
con $wpdb->prepare()
:
// How to get all published pages global $wpdb; // these variables we get earlier somewhere in the code, maybe it is form data $page_author_id = 1; $post_type_name = 'page'; // the usage of $wpdb->prepare() statement $pages = $wpdb->get_results( $wpdb->prepare( " SELECT post_title, post_content FROM $wpdb->posts WHERE post_author = '%d' AND post_type = '%s' ", $page_author_id, // %d because it is number $post_type_name // %s because it is string ) ); // print the page titles to see the result if( $pages ) { foreach ( $pages as $page ) { echo $page->post_title; } }
Conosci altri modi per proteggere il database di WordPress? Per favore, condividili nei commenti.
Commenti