Bygg et WordPress Security Plugin Grunnleggende

WordPress er åpen kildekode, noe som betyr at alle, inkludert hackere med en ondsinnet hensikt, kan skure kildekoden som ser etter hull i sikkerheten. I dette settet av opplæringsprogrammer vil vi gå gjennom prosessen med å lage et WordPress-plugin for å oppdage og fikse eventuelle sikkerhetsfeil som kan ligge i WordPress-installasjonen.


Trinn 1 Oppsett og metadata

Gå videre og lag en ny mappe i plugin-katalogen din sikker, så opprett en fil som heter safe.php inni det. De første kodelinjene for et plugin er bare å fortelle WordPress at det er et plugin, hva det kalles og annen informasjon av den typen. Denne delen ligner metadataene til et tema eller en mal.

 / * Plugin Name: Sikker Plugin URI: http://wp.tutsplus.com Beskrivelse: Den enkleste og mest effektive måten å sikre ditt WordPress-nettsted fra angripere. Forfatter: Fouad Matin Versjon: 1.0 Forfatter URI: http://wp.tutsplus.com/author/fouad * /

Oppdatering: Som ifølge Christopher's kommentar nedenfor, er det ikke lenger behov for å definere WP_CONTENT_URL, WP_CONTENT_DIR, WP_PLUGIN_URL, og WP_PLUGIN_DIR som WordPress definerer dem for oss i filen includes / default-constants.php.


Trinn 2 Handling og filter systemer

Deretter må vi sette inn noen handlingskroker, hvilke funksjoner utløses etter at en bestemt hendelse skjer, for eksempel admin_menu funksjon blir kalt. Handlinger brukes vanligvis til å modifisere databasedata, e-postmeldinger og modifisere det som vises på skjermen. Filtre, derimot, er kroker som lanseres før du gjengir tekst eller sender data. Du kan også fjerne handlinger hvis du vil, for eksempel wp_generator funksjon.

 remove_action ('wp_head', 'wp_generator');

Trinn 3 Definer de faktiske funksjonene

Først, før du legger til noen av våre tekst i pluginet, skal vi i hovedsak legge inn et stilark ved hjelp av wp_enqueue_style funksjon. Denne funksjonen er bare en trygg måte å legge til CSS-filer på en WordPress-generert side. For mer informasjon om enqueuing, sjekk ut Japhs veiledning om å inkludere javascript og css.

 ADD_ACTION ( 'admin_enqueue_scripts', 'safe_styles'); funksjon safe_styles () wp_enqueue_style ('safe_style', plugins_url ('/ css / safe.css', __FILE__)); 

Nå, for at brukeren skal kunne åpne plugin-siden, må vi legge til en menyside for pluginet vårt. Sikkerhetsprogrammet bør også bare være tilgjengelig for administratorer (du kan endre dette hvis du vil).

 add_action ('admin_menu', 'add_menu_bpg'); funksjon add_menu_bpg () if (! current_user_can ('administrator')) return false;  hvis (funksjon_eksisterer ('add_menu_page')) add_menu_page ('Safe', 'Safe', 'edit_pages', 'safe-admin-side', 'safe_main', WP_PLUGIN_URL. '/ safe / img / safe.png') ; 

Trinn 4 Metaboxer

For å vise informasjon på plugin-siden bruker vi metaboxer for å gjøre det ser ut til å være i overensstemmelse med WordPress admin-temaet. Vi skal vise system / server informasjon og også kjøre noen grunnleggende, hurtige sikkerhetskontroller.

 funksjon safe_meta_box () ?> 

Nå, la oss sjekke om det er en konto med standardinnstillingen for admin som er den første gjetningen til de fleste hackere og derfor en enkel måte i administrasjonspanelet. Jeg anbefaler også at du konfigurerer en .htaccess-fil i din wp-admin katalog som blokkerer alle andre IP-adresser enn din. I vår neste artikkel vil vi sette opp en måte å konfigurere .htaccess fra plugin-siden til.

 global $ wpdb; ekko '
WP ID-META-tag fjernet fra WordPress-kjerne
'; ekko '
'; $ name = $ wpdb-> get_var ("SELECT user_login FROM $ wpdb-> brukere WHERE user_login =" admin ""); hvis ($ navn == "admin") echo '"admin" bruker eksisterer.'; annet echo 'Ingen bruker "admin".'; ekko '
'; ekko '
'; hvis (file_exists ('. htaccess')) echo '.htaccess fil funnet i wp-admin /'; annet echo 'Filen .htaccess finnes ikke i wp-admin-delen.'; ekko '
'; ?>

La oss legge til en annen kolonne / boks til høyre på skjermen, der vi kan vise all serverens informasjon og innstillinger.

 funksjonen safe_meta_box2 () ?> 

Trinn 5 Hovedfunksjoner

Bare for organisatoriske formål, opprett en ny katalog som heter inc inne i din sikker katalog, hvor du vil opprette en fil som heter functions.php å holde hovedfunksjonene våre. Disse funksjonene vil være ansvarlige for å kjøre testene, sjekke filtillatelser, databaseinnstillinger, etc. Det er bedre bare å skille disse fra hovedpluginfilen, slik at det er lettere å navigere og lese.

Først begynner du ved å starte en tilkobling til databasen og hente MySQL-versjonen og MySQL-informasjonen. La oss også sjekke om PHP-sikker modus er slått på, da det kan føre til hodepine med andre plugins og innstillinger.

 funksjon safe_get_serverinfo () global $ wpdb; $ sqlversion = $ wpdb-> get_var ("SELECT VERSION () AS versjon"); $ mysqlinfo = $ wpdb-> get_results ("SHOW VARIABLES LIKE 'sql_mode'"); hvis (is_array ($ mysqlinfo)) $ sql_mode = $ mysqlinfo [0] -> Verdi;  hvis (tomt ($ sql_mode)) $ sql_mode = __ ('Ikke satt');  $ sm = ini_get ('safe_mode'); hvis (strcasecmp ('On', $ sm) == 0) $ safe_mode = __ ('On');  ellers $ safe_mode = __ ('Off'); 

For å akseptere innkommende pingbacks, allow_url_fopen må settes til "på" i php.ini. Men det gjør også koden din mottakelig for kodeinjeksjon, fordi file_get_contents () kan hente data fra eksterne steder som en FTP eller en webserver.

 hvis (ini_get ('allow_url_fopen')) $ allow_url_fopen = __ ('On');  else $ allow_url_fopen = __ ('Off'); 

Minnebegrensninger og utførelsestider vil spille en viktig rolle i neste del av opplæringen for plugin for å foreslå mulige løsninger på sikkerhetsfeil mens du tar hensyn til systemets grenser.

 hvis (ini_get ('upload_max_filesize')) $ upload_max = ini_get ('upload_max_filesize');  ellers $ upload_max = __ ('N / A');  hvis (ini_get ('post_max_size')) $ post_max = ini_get ('post_max_size');  ellers $ post_max = __ ('N / A');  hvis (ini_get ('max_execution_time')) $ max_execute = ini_get ('max_execution_time');  ellers $ max_execute = __ ('N / A');  hvis (ini_get ('memory_limit')) $ memory_limit = ini_get ('memory_limit');  ellers $ memory_limit = __ ('N / A');  hvis (function_exists ('memory_get_usage')) $ memory_usage = runde (memory_get_usage () / 1024/1024, 2). __ ('MByte');  ellers $ memory_usage = __ ('N / A');  hvis (is_callable ('exif_read_data')) $ exif = __ ('Ja'). "(V". Substr (phpversion ('exif'), 0,4). ")";  ellers $ exif = __ ('Nei');  hvis (is_callable ('iptcparse')) $ iptc = __ ('Ja');  ellers $ iptc = __ ('Nei');  hvis (is_callable ('xml_parser_create')) $ xml = __ ('Ja');  ellers $ xml = __ ('Nei'); 

Nå spytter vi bare ut alle dataene vi nettopp har samlet om serveren.

 ?> 
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • : s
  • :
  • :
  • :
  • En annen stor feil i de fleste generiske WordPress-installasjoner er bruken av standardtabellprefikset: wp_. I vår neste artikkel vil vi sette opp en måte å sikkerhetskopiere og omdøpe tabellene som er der safe_check_table_prefix og safe_errorsoff Funksjoner vil komme til spill.

     funksjon safe_check_table_prefix () if ($ GLOBALS ['table_prefix'] == 'wp_') echo 'Din tabell prefiks bør ikke være wp_.
    '; annet echo 'Ditt tabell prefiks er ikke wp_.
    '; funksjon safe_errorsoff () echo 'WordPress DB feil slått av.
    ';

    Hvis du har en eldre versjon av WordPress, må du først oppgradere. Uansett hvor godt du er av hvordan du holder styr på oppgraderinger, er det alltid mulighet for at du kan falle bak. Når sikkerhetsfeilene til en tidligere versjon er oppført i endringsloggen for den nye versjonen, er installasjonens sikkerhet nå skadet. De fleste temaer gjør det som standard, men bare for å være sikker, fjernet vi det tidligere ved hjelp av remove_action filter og nå skal vi bare sørge for at sluttbrukeren vet det også.

     funksjon safe_version_removal () global $ wp_version; ekko 'Din WordPress-versjon er vellykket skjult.
    '; funksjon safe_check_version () $ c = get_site_transient ('update_core'); hvis (is_object ($ c)) hvis (tomt ($ c-> oppdateringer)) echo ''.__ (' Du har den nyeste versjonen av Wordpress. ').''; komme tilbake; hvis (! tom ($ c-> oppdateringer [0])) $ c = $ c-> oppdateringer [0]; hvis (! isset ($ c-> respons) || 'siste' == $ c-> respons) echo ''.__ (' Du har den nyeste versjonen av Wordpress. ').''; komme tilbake; hvis ('oppgradere' == $ c-> respons) $ lv = $ c-> nåværende; $ m = ''.Sprintf (' Wordpress (% S) er tilgjengelig. Du bør oppgradere til den nyeste versjonen. ', $ Lv).''; ekko __ ($ m); komme tilbake; ekko ''.__ (' Det har oppstått en feil under forsøk på å hente statusen til Wordpress-versjonen. ').'';

    Med nyere versjoner av WordPress, sikkerheten til wp-config.php bør ikke være et problem, men det er bedre å være trygg enn beklager. Hvis noen med ondsinnet hensikt skulle få hendene på deg wp-config.php, de kunne få tilgang til legitimasjonene for databasetilgang, autorisasjonstaster og databasesalter. Vi kontrollerer bare om vi kan få filen, skrive til filen eller hvis den eksisterer i den katalogen i det hele tatt. Hvis det gjør det, viser vi en pressemelding og i vår neste artikkel en metode for å løse problemet enkelt.

     funksjon safe_wpConfigCheckPermissions ($ wpConfigFilePath) hvis (! er_writable ($ wpConfigFilePath)) echo ''.__ (' Din wp config-fil er ikke en trussel. ').''; returner falsk;  hvis (! function_exists ('file') ||! function_exists ('file_get_contents') ||! function_exists ('file_put_contents')) echo ''.__ (' Din wp config-fil er ikke en trussel. ').''; returner falsk;  annet echo ''.__ (' Din wp config-fil kan bli skadet av hackere, fikse tillatelsene. ').''; returnere sant; 

    Nå må vi gå tilbake til safe.php fil og legg til vår nye functions.php, over handlingen og filterkrokene.

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

    Trinn 6 Rendering

    Tilbake til safe.php, det siste tillegget er safe_main () funksjon som kalles når siden lastes inn. Her må vi legge til metaboxene vi definerte tidligere, og legge til noen styling.

     funksjon 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"); ekko ' 
    '; do_meta_boxes ('box1', 'advanced', '); ekko'
    '; do_meta_boxes ('box2', 'advanced', '); ekko'
    ';

    Til slutt, lag en CSS-fil som heter safe.css i en katalog som heter css under vår sikker katalogen. Du kan stillegge boksene du vil, eller du kan bare bruke følgende CSS-kode for feilen og suksessteksten:

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

    Konklusjon

    Ved nå bør du vite hvordan du legger til en menyside for pluginet ditt, bruk handling og filter kroker, og kontroller programmatisk for eventuelle sikkerhetsfeil i WordPress.

    Hvis du har ytterligere forslag eller spørsmål angående sikkerhetsplugger, kan du ikke legge igjen en kommentar! Også dette pluginet er på GitHub, så fortsett, gaffel depotet og tilpass det, men du vil ha det.

    Oppdatering: Denne artikkelen er oppdatert i henhold til Christophers forslag nedenfor.