Een WordPress Security-plug-in bouwen de basisprincipes

WordPress is open source, wat betekent dat iedereen, inclusief hackers met een kwaadwillende bedoeling, de broncode kan doorzoeken op zoek naar gaten in de beveiliging ervan. In deze reeks zelfstudies gaan we door het proces van het maken van een WordPress-plug-in om eventuele beveiligingsfouten in uw WordPress-installatie te detecteren en op te lossen..


Stap 1 Setup & metadata

Ga je gang en maak een nieuwe map in je opgeroepen plugins-map veilig, maak vervolgens een bestand met de naam safe.php in het. De eerste paar coderegels voor een plug-in vertellen WordPress gewoon dat het een plug-in is, hoe het wordt genoemd en andere informatie van die aard. Dit gedeelte is vergelijkbaar met de metagegevens van een thema of sjabloon.

 / * Plugin Name: Safe Plugin URI: http://wp.tutsplus.com Beschrijving: De eenvoudigste en meest effectieve manier om uw WordPress-site te beveiligen tegen aanvallers. Auteur: Fouad Matin Versie: 1.0 Auteur URI: http://wp.tutsplus.com/author/fouad * /

Update: Volgens onderstaande opmerking van Christopher hoeft er niet langer te worden gedefinieerd WP_CONTENT_URL, WP_CONTENT_DIR, WP_PLUGIN_URL, en WP_PLUGIN_DIR zoals WordPress ze voor ons definieert in het bestand includes / default-constants.php.


Stap 2 Actie- en filtersystemen

Vervolgens moeten we actiehaken plaatsen, functies die worden geactiveerd nadat een bepaalde gebeurtenis heeft plaatsgevonden, zoals de ADMIN_MENU functie wordt aangeroepen. Acties worden meestal gebruikt voor het wijzigen van databasegegevens, e-mailberichten en het wijzigen van wat op het scherm wordt weergegeven. Filters daarentegen zijn haken die worden gelanceerd voorafgaand aan het renderen van tekst of het verzenden van gegevens. Je kunt ook acties verwijderen als je wilt, zoals de wp_generator functie.

 remove_action ('wp_head', 'wp_generator');

Stap 3 Definieer de feitelijke functies

Ten eerste gaan we, voordat we een van onze tekst in de plug-in toevoegen, in essentie een stylesheet insluiten met behulp van de wp_enqueue_style functie. Deze functie is slechts een veilige manier om CSS-bestanden aan een door WordPress gegenereerde pagina toe te voegen. Raadpleeg de handleiding van Japh voor meer informatie over het plaatsen van javascript en css.

 add_action (admin_enqueue_scripts ',' safe_styles); function safe_styles () wp_enqueue_style ('safe_style', plugins_url ('/ css / safe.css', __FILE__)); 

Om de gebruiker in staat te stellen de plugin-pagina te openen, moeten we nu een menupagina voor onze plug-in toevoegen. De beveiligingsinvoegtoepassing moet ook alleen beschikbaar zijn voor beheerders (u kunt dit wijzigen als u dat wilt).

 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') ; 

Stap 4 Metaboxen

Om informatie over de plugin-pagina weer te geven, gebruiken we metaboxen om deze consistent te maken met het WordPress-beheerdersthema. We willen de systeem- / serverinformatie weergeven en ook wat eenvoudige, snelle beveiligingscontroles uitvoeren.

 function safe_meta_box () ?> 

Laten we nu controleren of er een account is met de standaardinstelling van beheerder Dit is de eerste schatting van de meeste hackers en daarom een ​​gemakkelijke manier om toegang te krijgen tot uw admin-paneel. Ook raad ik aan dat u een .htaccess-bestand in uw configureert wp-admin map die alle IP-adressen blokkeert behalve de jouwe. In ons volgende artikel zullen we een manier instellen om de .htaccess vanaf de plugin-pagina te configureren.

 globale $ wpdb; echo '
WP ID META-tag verwijderd uit WordPress core
'; echo '
'; $ name = $ wpdb-> get_var ("SELECT user_login FROM $ wpdb-> users WHERE user_login =" admin ""); if ($ name == "admin") echo '"admin" -gebruiker bestaat.'; else echo 'Geen gebruiker "admin".'; echo '
'; echo '
'; if (file_exists ('. htaccess')) echo '.htaccess-bestand gevonden in wp-admin /'; else echo 'Het bestand .htaccess bestaat niet in het gedeelte wp-admin.'; echo '
'; ?>

Laten we een andere kolom / box aan de rechterkant van het scherm toevoegen, waar we alle informatie en instellingen van de server kunnen weergeven.

 function safe_meta_box2 () ?> 

Stap 5 Hoofdfuncties

Gewoon voor organisatorische doeleinden, maak een nieuwe map met de naam inc in je veilig map, waar u een bestand met de naam functions.php om onze hoofdfuncties te houden. Deze functies zijn verantwoordelijk voor het uitvoeren van de tests, het controleren van bestandspermissies, database-instellingen, etc. Het is beter om deze alleen te scheiden van het hoofdinvoegbestand, zodat het gemakkelijker is om te navigeren en te lezen.

Begin eerst met het initiëren van een verbinding met de database en het ophalen van de MySQL-versie en MySQL-informatiearray. Laten we ook eens kijken of de PHP-veilige modus is ingeschakeld, want dit kan enige hoofdpijn veroorzaken met andere plug-ins en instellingen.

 function safe_get_serverinfo () global $ wpdb; $ sqlversion = $ wpdb-> get_var ("SELECT VERSION () AS-versie"); $ mysqlinfo = $ wpdb-> get_results ("SHOW VARIABLES LIKE 'sql_mode'"); if (is_array ($ mysqlinfo)) $ sql_mode = $ mysqlinfo [0] -> Waarde;  if (empty ($ sql_mode)) $ sql_mode = __ ('Niet ingesteld');  $ sm = ini_get ('safe_mode'); if (strcasecmp ('Aan', $ sm) == 0) $ safe_mode = __ ('Aan');  else $ safe_mode = __ ('Uit'); 

Om binnenkomende pingbacks te accepteren, allow_url_fopen moet in uw php.ini op "aan" staan. Het maakt uw code echter ook vatbaar voor code-injectie, omdat de file_get_contents () kan gegevens ophalen van externe locaties zoals een FTP- of webserver.

 if (ini_get ('allow_url_fopen')) $ allow_url_fopen = __ ('Aan');  else $ allow_url_fopen = __ ('Uit'); 

Geheugenbeperkingen en uitvoeringstijden zullen een belangrijke rol spelen in het volgende deel van de tutorial voor de plug-in om mogelijke oplossingen voor beveiligingsfouten te suggereren, rekening houdend met de limieten van het systeem.

 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 = __ ('Ja'). "(V". Substr (phpversion ('exif'), 0,4). ")";  else $ exif = __ ('Nee');  if (is_callable ('iptcparse')) $ iptc = __ ('Ja');  else $ iptc = __ ('Nee');  if (is_callable ('xml_parser_create')) $ xml = __ ('Ja');  else $ xml = __ ('Nee'); 

Nu spugen we alle gegevens uit die we net over de server hebben verzameld.

 ?> 
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • : s
  • :
  • :
  • :
  • Een andere grote tekortkoming in de meeste generieke WordPress-installaties is het gebruik van de standaardtabelprefix: wp_. In ons volgende artikel zullen we een manier instellen om een ​​back-up te maken en de tabellen te hernoemen, waar de safe_check_table_prefix en safe_errorsoff functies zullen een rol gaan spelen.

     function safe_check_table_prefix () if ($ GLOBALS ['table_prefix'] == 'wp_') echo 'Uw tabelvoorvoegsel zou dat niet moeten zijn wp_.
    '; else echo 'Het voorvoegsel van uw tabel is dat niet wp_.
    '; functie safe_errorsoff () echo 'WordPress DB Errors uitgeschakeld.
    ';

    Als u een oudere versie van WordPress hebt, voert u eerst een upgrade uit. Ongeacht hoe goed je bent hoe upgrades bij te houden, er is altijd de mogelijkheid dat je achterop raakt. Zodra de beveiligingsfouten van een vorige versie in het wijzigingslogboek voor de nieuwe versie worden vermeld, is de beveiliging van uw installatie nu aangetast. De meeste thema's doen het standaard, maar om het zeker te weten, we hebben het eerder verwijderd met behulp van de remove_action filter en nu zorgen we ervoor dat de eindgebruiker het ook weet.

     function safe_version_removal () global $ wp_version; echo 'Je WordPress-versie is succesvol verborgen.
    '; function safe_check_version () $ c = get_site_transient ('update_core'); if (is_object ($ c)) if (leeg ($ c-> updates)) echo ''.__ (' U hebt de nieuwste versie van WordPress. ').''; terug te keren; if (! empty ($ c-> updates [0])) $ c = $ c-> updates [0]; if (! isset ($ c-> response) || 'latest' == $ c-> antwoord) echo ''.__ (' U hebt de nieuwste versie van WordPress. ').''; terug te keren; if ('upgrade' == $ c-> antwoord) $ lv = $ c-> huidige; $ m = ''.Sprintf (' Wordpress (% S) is beschikbaar. Je moet upgraden naar de nieuwste versie. ', $ Lv).''; echo __ ($ m); terug te keren; echo ''.__ (' Er is een fout opgetreden bij het ophalen van de status van uw WordPress-versie. ').'';

    Met de nieuwere versies van WordPress, de beveiliging van de wp-config.php zou geen probleem moeten zijn, maar het is beter om veilig te zijn dan sorry. Als iemand met kwaadaardige bedoelingen je in handen zou krijgen wp-config.php, ze kunnen toegang krijgen tot uw databasetoegangsgegevens, machtigingssleutels en databasezouten. We zullen alleen controleren of we het bestand kunnen ophalen, naar het bestand kunnen schrijven of helemaal in die map kunnen voorkomen. Als dat zo is, laten we een dringende melding zien en in ons volgende artikel een methode om het probleem eenvoudig op te lossen.

     function safe_wpConfigCheckPermissions ($ wpConfigFilePath) if (! is_writable ($ wpConfigFilePath)) echo ''.__ (' Uw wp-configuratiebestand is geen bedreiging. ').''; return false;  if (! function_exists ('file') ||! function_exists ('file_get_contents') ||! function_exists ('file_put_contents')) echo ''.__ (' Uw wp-configuratiebestand is geen bedreiging. ').''; return false;  else echo ''.__ (' Uw wp-configuratiebestand kan worden gehackt door hackers, de rechten herstellen. ').''; geef waar terug; 

    Nu moeten we teruggaan naar de safe.php bestand en voeg onze nieuwe toe functions.php, boven de actie- en filterhaken.

     require_once (WP_PLUGIN_DIR. "/safe/inc/functions.php");

    Stap 6 Rendering

    Terug naar de safe.php, de laatste toevoeging is de safe_main () functie die wordt aangeroepen wanneer de pagina wordt geladen. Hier moeten we de metaboxen toevoegen die we eerder hebben gedefinieerd en wat styling toevoegen.

     function safe_main () add_meta_box ("safe_box_1", "Basic Checks", "safe_meta_box", "box1"); add_meta_box ("safe_box_2", "System Information", "safe_meta_box2", "box2"); echo ' 
    '; do_meta_boxes ('box1', 'advanced', '); echo'
    '; do_meta_boxes ('box2', 'advanced', '); echo'
    ';

    Maak ten slotte een CSS-bestand met de naam safe.css in een map genaamd css onder onze veilig directory. U kunt de vakken opmaken zoals u dat wilt, of u kunt gewoon de volgende CSS-code gebruiken voor de fout- en succestekst:

     div.pass, span.pass color: # 7AB317;  div.fail, span.fail color: # ff3333;  div.fail, span.fail a color: # ff3333; 

    Conclusie

    Inmiddels zou u moeten weten hoe u een menupagina voor uw plug-in kunt toevoegen, actie en filterhaken kunt toepassen en op programmatische wijze kunt controleren op eventuele beveiligingsfouten in WordPress.

    Als u nog meer suggesties of vragen over beveiligingsplug-ins heeft, kunt u een reactie achterlaten! Deze plug-in is ook op GitHub, dus ga je gang, vork de repository en pas het aan zoals je wilt.

    Update: dit artikel is bijgewerkt volgens onderstaande suggesties van Christopher.