Optimierung und Sicherung / WordPress CMS
Tagi: Audit WordPress, Optimierung, seo, Sicherung, Webseiten, WordPress
iREBU Agencja Interaktywa / Studio graficzne
Autor: @irebu
Specjalista Wordpress / Programowanie / Projekty graficzne / Wydruk
I. Datenarchivierung
Bevor ich mit der Arbeit beginne, mache ich zuerst eine Kopie der Internetseite.
- BackUpWordPress.
II. WordPress CMS und Add-Ons Update
Der erste Schritt der Optimierung besteht darin, das System und die Add-Ons auf die neuesten Versionen zu aktualisieren. Dies ist sehr wichtig, weil die Autoren von Zeit zu Zeit Fehler korrigieren, Sicherheitslücken beseitigen, die Arbeitsgeschwindigkeit erhöhen oder neue, interessante Funktionen hinzufügen.
III. Optimierung der Betriebsgeschwindigkeit
Bei WordPress installierte Internetseiten werden häufig langsam geladen, insbesondere abends, wenn das Hosting am stärksten ausgelastet ist. Man muss zunächst die PHP-Version auf dem Server auf 7 ändern und unnötige Add-Ons deaktivieren. Dann installiere ich ein PHP-Code-Caching-Plugin, mit dem dynamische Seiten in statischer Form geöffnet und Seitencode und Bildgrößen minimiert werden können. Man sollte die Internetseite für das globale Cloudflare-CDN (cloudflare.com) konfigurieren, wodurch die Internetseite von den nächstgelegenen Standorten des Benutzers auf der ganzen Welt heruntergeladen wird.
- P3 Plugin Performance Profiler, Analyse und Deaktivierung unnötiger Add-Ons,
- W3 Total Cache, WP Super Cache, LiteSpeed Cache, PHP-Code-Caching,
- Autoptimize, Minimierung des Seitencodes,
- Jetpack z WordPress.com / Photon, Fotooptimierung, Komprimierung und Integration mit WordPress CDN,
- .htaccess optimization, Änderung der Browser-Cachingszeit des Codes, Code-Komprimierung für den Browser:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(php|html|htm|css|js|ico|jpg|jpeg|png|gif|swf|json|txt|eot|woff|woff2|ttf|svg)$ empty [R=404,L]
<FilesMatch "\.(css|js|ico|jpg|jpeg|png|gif|swf|xml|json|txt|eot|woff|woff2|ttf|svg|pdf|doc|xls)$">
RequestHeader unset Cookie
Header unset Set-Cookie
Header unset Cookie
</FilesMatch>
<IfModule mod_expires.c>
FileETag MTime
ExpiresActive on
ExpiresDefault "access plus 28 days"
ExpiresByType text/html "access plus 3 hours"
ExpiresByType application/json "access plus 3 hours"
ExpiresByType text/xml "access plus 3 hours"
ExpiresByType application/xml+rss "access plus 3 hours"
ExpiresByType text/css "access plus 7 days"
ExpiresByType text/javascript "access plus 14 days"
ExpiresByType application/x-javascript "access plus 14 days"
ExpiresByType application/javascript "access plus 14 days"
ExpiresByType text/plain "access plus 28 days"
ExpiresByType image/x-icon "access plus 28 days"
ExpiresByType image/jpeg "access plus 28 days"
ExpiresByType image/png "access plus 28 days"
ExpiresByType image/gif "access plus 28 days"
ExpiresByType application/x-shockwave-flash "access plus 28 days"
ExpiresByType application/x-font-ttf "access plus 1 years"
ExpiresByType application/x-font-opentype "access plus 1 years"
ExpiresByType application/x-font-woff "access plus 1 years"
ExpiresByType application/x-font-woff2 "access plus 1 years"
ExpiresByType application/vnd.ms-fontobject "access plus 1 years"
ExpiresByType image/svg+xml "access plus 1 years"
ExpiresByType text/x-component "access plus 1 years"
</IfModule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml+rss
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-shockwave-flash
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-woff
AddOutputFilterByType DEFLATE application/x-font-woff2
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE text/x-component
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
- wp-config.php-Optimierung, Änderung der Cron-Task-Aufrufzeit:
define('WP_CRON_LOCK_TIMEOUT', 600);
IV. Datenbankoptimierung
Optimiert die Datenbanktabellen, leert den Papierkorb, löscht Eintragsversionen, automatische Skizzen, Spam und alte Daten. Der meiste Platz wird von Eintragsversionen eingenommen, weshalb man deren Anzahl zusätzlich auf 100 begrenzen sollte.
- WP-Optimize,
- wp-config.php-Optimierung, Änderung der Häufigkeit des Autospeicherns von Einträgen und Einschränkung der Versionenanzahl:
define('AUTOSAVE_INTERVAL',3600);
define('WP_POST_REVISIONS',100);
V. Sicherheit
Als erstes sollte man bei der Installation von WordPress einen anderen Datenbanknamen als den Standardnamen angeben. Man darf nicht die Standardanmeldung "admin" oder "administrator" als Administratorname verwenden. Wenn Sie Informationen auf der Site bereitstellen, sollten Sie das Administratorkonto nicht zum Veröffentlichen von Artikeln und Kommentaren verwenden, und der Nickname muss anders als der Benutzername festgelegt werden. Dadurch wird man viele Angriffe vermeiden, die unser Passwort zur Seite erzwingen wollen.
- Wordfence Security, Schutz vor Grundangriffen und Viren,
- Loginizer, Login-Schutz / Anti Brute Force,
- PHP-Schutz:
function sr_security() {
global $user_ID;
if ($user_ID) {
if ( !current_user_can('manage_options') ) {
if (strlen($_SERVER['REQUEST_URI']) > 255 ||
stripos($_SERVER['REQUEST_URI'], "eval(") ||
stripos($_SERVER['REQUEST_URI'], "CONCAT") ||
stripos($_SERVER['REQUEST_URI'], "UNION+SELECT") ||
stripos($_SERVER['REQUEST_URI'], "base64")) {
if (!headers_sent()) {
header("HTTP/1.1 414 Request-URI Too Long");
header("Status: 414 Request-URI Too Long");
header("Connection: Close");
}
exit;
}
}
}
}
add_action( 'init', 'sr_security' );
- .htaccess-Schutz, Autorensuchblockade, 5G BLACKLIST/FIREWALL:
RewriteCond %{QUERY_STRING} author=
RewriteRule .* empty [R=404,L]
# 5G BLACKLIST/FIREWALL
# @ http://perishablepress.com/5g-blacklist/
# 5G:[QUERY STRINGS]
<ifModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (environ|localhost|mosconfig|scanner) [NC,OR]
RewriteCond %{QUERY_STRING} (mod)\=\.?/? [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
RewriteCond %{QUERY_STRING} echo.*kae [NC,OR]
RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
RewriteCond %{QUERY_STRING} \=\\%27$ [NC,OR]
RewriteCond %{QUERY_STRING} \=\\\'$ [NC,OR]
RewriteCond %{QUERY_STRING} \.\./ [NC,OR]
RewriteCond %{QUERY_STRING} \? [NC]
RewriteRule .* - [F]
</ifModule>
# 5G:[USER AGENTS]
<ifModule mod_setenvif.c>
SetEnvIfNoCase User-Agent (casper|cmsworldmap|diavol|dotbot) keep_out
SetEnvIfNoCase User-Agent (flicky|ia_archiver|jakarta|kmccrew) keep_out
SetEnvIfNoCase User-Agent (libwww|planetwork|pycurl|skygrid) keep_out
SetEnvIfNoCase User-Agent (purebot|comodo|feedfinder|turnit) keep_out
SetEnvIfNoCase User-Agent (zmeu|nutch|vikspider|binlar|sucker) keep_out
<limit GET POST PUT>
Order Allow,Deny
Allow from all
Deny from env=keep_out
</limit>
</ifModule>
# 5G:[REQUEST STRINGS]
<ifModule mod_alias.c>
RedirectMatch 403 (https?|ftp|php)\://
RedirectMatch 403 /(cgi|https?|ima|ucp)/
RedirectMatch 403 /(Permanent|Better)$
RedirectMatch 403 (\=\\\'|\=\\%27|/\\\'/?|\)\.css\()$
RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$
RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml)
RedirectMatch 403 \.well\-known/host\-meta
RedirectMatch 403 /function\.array\-rand
RedirectMatch 403 \)\;\$\(this\)\.html\(
RedirectMatch 403 proc/self/environ
RedirectMatch 403 msnbot\.htm\)\.\_
RedirectMatch 403 /ref\.outcontrol
RedirectMatch 403 com\_cropimage
RedirectMatch 403 indonesia\.htm
RedirectMatch 403 \{\$itemURL\}
RedirectMatch 403 function\(\)
RedirectMatch 403 labels\.rdf
RedirectMatch 403 /playing.php
RedirectMatch 403 muieblackcat
</ifModule>
# 5G:[BAD IPS]
<limit GET POST PUT>
Order Allow,Deny
Allow from all
# uncomment/edit/repeat next line to block IPs
# Deny from 123.456.789
</limit>
# 5G:[WordPress]
<ifModule mod_rewrite.c>
RedirectMatch 403 /\$\&
RedirectMatch 403 (?i)/\&(t|title)=
RedirectMatch 403 (?i)/\.(bash|git|hg|log|svn|swp|tar)
RedirectMatch 403 (?i)/(1|contact|i|index1|iprober|phpinfo|phpspy|product|signup|t|test|tz|visit|webshell|wp-signup).php
RedirectMatch 403 (?i)/(author-panel|class|database|manage|phpMyAdmin|register|submit-articles|system|usage|webmaster)/?$
RedirectMatch 403 (?i)/(=|_mm|cgi|cvs|dbscripts|jsp|rnd|userfiles)
</ifModule>
- wp-config.php-Schutz, Deaktivierung der Dateibearbeitung bei WordPress:
define('DISALLOW_FILE_EDIT',true);
WordPress wird oft als SEO-Verzeichnis verwendet, wodurch jeder Benutzer ein potenzielles Ziel für Spammer ist. Man darf keine ungesicherten Formulare hinterlassen, weil man sonst eine Vielzahl von automatisch generierten Kommentaren und E-Mails ins Postfach bekommt.
- Akismet, Spamschutz,
- Formularschutz:
.DISABLE{display:none}
<input name="sr-code" value="ąćęłńóśżź" type="hidden" />
<input class="DISABLE" name="submit" value="spam" type="submit" />
<input name="submit" value="Wyślij" type="submit" />
if (($_POST['submit']==='spam') || ($_POST['sr-code']!=='ąćęłńóśżź')) die();