Sicurezza WordPress (2/3): Proteggi il Database 4

Sicurezza WordPress (2/3): Proteggi il Database

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:

Sicurezza WordPress (2/3): Proteggi il Database 5

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_usermetawp_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.

  1. Utilizza sempre $wpdb per connetterti a MySQL.
  2. è fondamentale eseguire $wpdb->query()$wpdb->get_col()$wpdb->get_var()$wpdb->get_row()$wpdb->get_results() with $wpdb->prepare() !
  3. 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.

Fatti sentire