WordPress htaccess: perfekt für PageSpeed und Sicherheit [12/2022]

322 Kommentare
Die perfekte .htaccess für WordPress – PageSpeed und Sicherheit

Diese WordPress htaccess ist die perfekte .htaccess für dein WordPress und sorgt für einen enormen Performanceschub und ein hohes Sicherheitslevel. Setze meine über 10 Jahre perfektionierte WordPress .htaccess Datei für dein WordPress-Tuning ein und freue dich über beste Ergebnisse und enorm viel Zuwachs an Sicherheit.

Mehr als zehn Jahre Erfahrung sind in meine perfekte .htaccess Datei eingeflossen und sie wurde von Jahr zu Jahr stets verbessert und überarbeitet. 2018 sind die Bereiche Hotlink Protection und der HTTP Schutz für den Adminbereich dazugekommen.

In 08 / 2019 habe ich die problematische 7G-Firewall auf die 2019er Version 6G zurückgenommen. Die 7G-Firewall läuft nun bei 95% aller Websites ohne Probleme. Zusätzlich kamen in 2019 noch die Bereiche „Blocking the »ReallyLongRequest« Bandit“ und der neue experimentelle Header EXPECT-CT dazu.

Die 7-G Firewall wurde am 07.11.2021 auf Version 1.5 aktualisiert.

Letztes Update der WordPress .htaccess: 15.12.2022 / Version 2.0.7

  • Dazugekommen: Aggressives Scannen nach Uploads-relevanten Zielen vereiteln – 27.08.2020
  • Dazugekommen: der Strict Origin When Cross Origin Security Header – 10.08.2020
  • Dazugekommen: Ultimate Hotlink Protection in 2018
  • Dazugekommen: Adminbereich mit HTTP Schutz versehen in 2018
  • Aktualisiert 08 / 2019: 7G Firewall auf 6G Firewall @2019
  • Aktualisiert: Strict Transport Security Header mit korrektem »max-age« Eintrag – Update 25.07.2018
  • Dazugekommen: Referrer-Policy Header am 05.06.2018
  • Dazugekommen: Block Nuisance Requests
  • Dazugekommen in 2019: Der Schutz gegen den »ReallyLongRequest« Bot
  • Dazugekommen in 2019: Der experimentelle Security Header EXPECT-CT
  • Update 02/2020: 6G Firewall auf 7G Firewall aktualisiert
  • Update 05/2021: Cache-Laufzeiten für Grafikformate und Fonts optimiert
  • Update 11/2021: 7G-Firewall auf Version 1.5 aktualisiert
  • Update 01/2022: Security Header „upgrade-insecure-requests“
  • Update 05/2022: Security Header „Permissions-Policy Header“
  • Update 08/2022: Caching für JavaScript-Module (.mjs) – 2.0.5
  • Update 10/2022: Neue WordPress Version 6 Standardregeln – 2.0.6
  • Update 12/2022: Expect-CT Header entfernt, weil veraltet.
  • Update 12/2022: WordPress-Autoren-Scans blockieren

Du magst dich vielleicht wundern, dass die Datei nicht gerade ein Leichtgewicht ist. Doch das Laden dieser Datei dauert nur einen Wimpernschlag. Der Effekt auf deine Website hingegen ist enorm. Ohne weitere Optimierungen wird dein WordPress schon deutlich schneller werden, weil alle wichtigen Bereiche komprimiert und gecacht werden. Und damit bildet diese Datei auch eine der Grundlagen für die Suchmaschinenoptimierung.

Alle optionalen Elemente sind mit Rauten (#) auskommentiert, zur Nutzung diese bitte entfernen.

Die perfekte .htaccess Datei teilt sich in 15 einzelne Bereiche auf:

  • HTTP zu HTTPS Umleitung
  • CORS aktivieren für bestimmte Dateitypen
  • Block Nuisance Requests (Lästige Anfragen blocken) – aktualisiert 07/2019
  • Dateien komprimieren und cachen
  • Die 7G-Firewall von Jeff Starr gegen die Einschleusung von Schadcode
  • Das 7G Addon gegen das aggressive Scannen von Upload-Dateien
  • Das Blocken von WordPress-Dateien gegen Zugriff von außen
  • Hotlink Protection gegen das Verlinken Deiner Bilder auf anderen Websites – 2018
  • Das Blockieren von externen Scans der Autorennamen – Neu in 2022
  • Blocking the »ReallyLongRequest« Bandit – Neu in 2019
  • Das Schützen des Adminbereichs mittels HTTP – 2018
  • Das Blocken des Sicherheitsrisikos XML-RPC
  • Der Referrer Header – 05.06.2018
  • Die HTTP-Security-Header – aktualisiert 15.12.2022
  • Die WordPress Standard-Regeln – aktualisiert 03.10.2022
Bitte beachten: Wenn Du diese Datei oder Auszüge daraus verwenden möchtest, dann nutze bitte den Download der Datei. Beim Kopieren des Codes aus meinem Code-Highlighter-Plugin schleichen sich ab und an Fehler ein.

Übrigens: Hier erfährst Du, wie Du Deine Cloud Sicherheit herstellst

Die WordPress htaccess als Zip-Datei zum Download

Ist Dir die Datei eine kleine Spende Wert?

Spende mit PayPal

Wichtig: Die Datei ist eine versteckte / Systemdatei und deshalb eventuell nach dem Download und dem Entpacken der ZIP-Datei nicht sichtbar. Du musst dann die Anzeige von versteckten Dateien in Deinem Betriebssystem erst aktivieren.

Falls Du Probleme mit dem Einbau der .htaccess bekommst, die SEO Agentur Hamburg kann diesen Job kostenpflichtig für Dich erledigen.

Die perfekte WordPress htaccess, die einzelnen Bereiche

1 – Garantierte HTTP zu HTTPS Umleitung

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Dieser Code sorgt im Gegensatz zu anderen Schnipseln für eine garantierte Weiterleitung aller HTTP-Anfragen auf die HTTPS-Version. In der .htaccess ist dieser Bereich auskommentiert, wenn du den Code nutzen möchtest, entferne die Rauten vor den einzelnen Elementen. Falls es zu Problemen mit diesem Code kommt, existiert bereits irgendwo in Deiner Installation eine Umleitung von HTTP auf HTTPS.

Mehr zum Thema: Garantierte Weiterleitung von HTTP zu HTTPS

Auch interessant: .htaccess Weiterleitung aller Seiten

2 – CORS aktivieren für bestimmte Dateitypen

Was genau ist CORS?

Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, der Webbrowsern oder auch anderen Webclients Cross-Origin-Requests ermöglicht. … CORS ist ein Kompromiss zugunsten größerer Flexibilität im Internet unter Berücksichtigung möglichst hoher Sicherheitsmaßnahmen.

CORS ist ein wichtiger Beitrag zu einer Sicherheitsstrategie in Verbindung mit einer Content Security Policy. Solltest Du diese Strategie einsetzen, dann ist dieser Teil bereits in meiner Datei enthalten.

Die perfekte .htaccess für WordPress - PageSpeed und Sicherheit

Eine Website umfasst vieles. Eine perfekte .htaccess gehört dazu.

<IfModule mod_headers.c>
    <FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js|mjs|gif|png|jpe?g|svg|svgz|ico|webp)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>

3 – Block Nuisance Requests (lästige Anfragen blocken)

Manche Bots suchen sehr emsig nicht existente Dateien auf Deinem Server / Webhosting und blockieren auf diese Weise die Ressourcen des Hostings. Der böswillige Datenverkehr spamt zudem die Fehlerprotokolle des Servers zu, sodass eigentliche Probleme durch diese Anfragen an nicht existente Dateien kaum mehr gefunden werden.

Auf günstigen Shared-Hostings können diese Anfragen durchaus Deine Website in die Knie zwingen und sehr langsam machen. Daher: gleich blockieren.

# ----------------------------------------------------------------------
# | BLOCK NUISANCE REQUESTS - @Update 2019  
#   https://perishablepress.com/block-nuisance-requests
# ----------------------------------------------------------------------

<IfModule mod_alias.c>
	RedirectMatch 403 (?i)\.php\.suspected
	RedirectMatch 403 (?i)apple-app-site-association
	RedirectMatch 403 (?i)/autodiscover/autodiscover.xml
</IfModule>

4 – Dateien komprimieren und cachen

Update 08/2022 – Support für JavaScript Module (.mjs Dateien)

Dieser Bereich ist der umfassendste. Doch jede einzelne Zeile Code ist für die Performance deiner Website wichtig. Jede Dateiart wird komprimiert an den Browser ausgeliefert und in diesem optimal in den Cache aufgenommen. Auch wenn du Plugins wie zum Beispiel Autoptimize und Cache Enabler einsetzt, muss dieser Abschnitt sein, denn er ergänzt diese Plugins für noch mehr Speed.

Ich bitte zu beachten, dass nur Dateien komprimiert und in den Cache aufgenommen werden können, die sich auf Deinem Server befinden.
# Serve resources with far-future expires headers.
#
# (!) If you don't control versioning with filename-based
# cache busting, you should consider lowering the cache times
# to something like one week.
#
# https://httpd.apache.org/docs/current/mod/mod_expires.html

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"

  # Data interchange
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rdf+xml                   "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/ld+json                   "access plus 0 seconds"
    ExpiresByType application/schema+json               "access plus 0 seconds"
    ExpiresByType application/vnd.geo+json              "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!) and cursor images
    ExpiresByType image/vnd.microsoft.icon              "access plus 1 week"
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML - Behält die Website eine Stunde im Cache, neues wird erst nach Ablauf einer Stunde
  # angezeigt. Wenn nicht gewuenscht, bei 3600 eine Null eintragen
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"
    ExpiresByType application/x-javascript              "access plus 1 year"
    ExpiresByType text/javascript                       "access plus 1 year"

  # Manifest files
    ExpiresByType application/manifest+json             "access plus 1 week"
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media files
    ExpiresByType audio/ogg                             "access plus 1 year"
    ExpiresByType image/bmp                             "access plus 1 year"
    ExpiresByType image/gif                             "access plus 1 year"
    ExpiresByType image/jpeg                            "access plus 1 year"
    ExpiresByType image/png                             "access plus 1 year"
    ExpiresByType image/svg+xml                         "access plus 1 year"
    ExpiresByType image/webp                            "access plus 1 year"
    ExpiresByType video/mp4                             "access plus 1 year"
    ExpiresByType video/ogg                             "access plus 1 year"
    ExpiresByType video/webm                            "access plus 1 year"

  # Web fonts

    # Embedded OpenType (EOT)
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 year"
    ExpiresByType font/eot                              "access plus 1 year"

    # OpenType
    ExpiresByType font/opentype                         "access plus 1 year"

    # TrueType
    ExpiresByType application/x-font-ttf                "access plus 1 year"

    # Web Open Font Format (WOFF) 1.0
    ExpiresByType application/font-woff                 "access plus 1 year"
    ExpiresByType application/x-font-woff               "access plus 1 year"
    ExpiresByType font/woff                             "access plus 1 year"

    # Web Open Font Format (WOFF) 2.0
    ExpiresByType application/font-woff2                "access plus 1 year"

  # Other
    ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
</IfModule>

<IfModule mod_deflate.c>
# Insert filters / compress text, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/vtt 
AddOutputFilterByType DEFLATE text/x-component
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/js
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/atom+xml 
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/ld+json 
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject 
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/font-woff2
AddOutputFilterByType DEFLATE application/x-font-woff
AddOutputFilterByType DEFLATE application/x-web-app-manifest+json font/woff
AddOutputFilterByType DEFLATE font/woff 
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon 

# Exception: Images
SetEnvIfNoCase REQUEST_URI \.(?:gif|jpg|jpeg|png|svg)$ no-gzip dont-vary

# Drop problematic browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>

#Alternative caching using Apache's "mod_headers", if it's installed.
#Caching of common files - ENABLED
<IfModule mod_headers.c>
<FilesMatch "\.(ico|pdf|flv|swf|js|mjs|css|gif|png|jpg|jpeg|txt|woff2|woff)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(js|mjs|css|xml|gz)$">
    Header append Vary Accept-Encoding
  </FilesMatch>
</IfModule>

# Set Keep Alive Header
<IfModule mod_headers.c>
    Header set Connection keep-alive
</IfModule>

# If your server don't support ETags deactivate with "None" (and remove header)
<IfModule mod_expires.c> 
  <IfModule mod_headers.c> 
    Header unset ETag 
  </IfModule> 
  FileETag None 
</IfModule>

<IfModule mod_headers.c>
<FilesMatch ".(js|mjs|css|xml|gz|html|woff|woff2|ttf)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>

5 – 7G-Firewall gegen die Einschleusung von Schadcode (Update 10/2021)

Dieser Abschnitt sorgt für echte Sicherheit. Immer wieder weisen Plugins und Themes eklatante Sicherheitslücken auf, durch die man Schadcode in eine Website einschleusen könnte. Diese Firewall schiebt dem einen Riegel vor und blockt die gängigen Methoden der Einschleusung.

Wenn Dich die WordPress Sicherheit interessiert, dann schaue Dir diesen Artikel an: WordPress absichern wie ein Profi.

# ----------------------------------------------------------------------
# | 7G Firewall for Security - Do not change this part @Update 11/2021
# ----------------------------------------------------------------------

# 7G FIREWALL v1.5 20211103
# @ https://perishablepress.com/7g-firewall/

# 7G:[CORE]
ServerSignature Off
Options -Indexes
RewriteEngine On
RewriteBase /

# 7G:[QUERY STRING]
<IfModule mod_rewrite.c>
	RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{QUERY_STRING} (/|%2f)(:|%3a)(/|%2f) [NC,OR]
	RewriteCond %{QUERY_STRING} (order(\s|%20)by(\s|%20)1--) [NC,OR]
	RewriteCond %{QUERY_STRING} (/|%2f)(\*|%2a)(\*|%2a)(/|%2f) [NC,OR]
	RewriteCond %{QUERY_STRING} (`|<|>|\^|\|\\|0x00|%00|%0d%0a) [NC,OR]
	RewriteCond %{QUERY_STRING} (ckfinder|fck|fckeditor|fullclick) [NC,OR]
	RewriteCond %{QUERY_STRING} ((.*)header:|(.*)set-cookie:(.*)=) [NC,OR]
	RewriteCond %{QUERY_STRING} (cmd|command)(=|%3d)(chdir|mkdir)(.*)(x20) [NC,OR]
	RewriteCond %{QUERY_STRING} (globals|mosconfig([a-z_]{1,22})|request)(=|\[) [NC,OR]
	RewriteCond %{QUERY_STRING} (/|%2f)((wp-)?config)((\.|%2e)inc)?((\.|%2e)php) [NC,OR]
	RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumbs?)?)((\.|%2e)php) [NC,OR]
	RewriteCond %{QUERY_STRING} (absolute_|base|root_)(dir|path)(=|%3d)(ftp|https?) [NC,OR]
	RewriteCond %{QUERY_STRING} (localhost|loopback|127(\.|%2e)0(\.|%2e)0(\.|%2e)1) [NC,OR]
	RewriteCond %{QUERY_STRING} (s)?(ftp|inurl|php)(s)?(:(/|%2f|%u2215)(/|%2f|%u2215)) [NC,OR]
	RewriteCond %{QUERY_STRING} (\.|20)(get|the)(_|%5f)(permalink|posts_page_url)(\(|%28) [NC,OR]
	RewriteCond %{QUERY_STRING} ((boot|win)((\.|%2e)ini)|etc(/|%2f)passwd|self(/|%2f)environ) [NC,OR]
	RewriteCond %{QUERY_STRING} (((/|%2f){3,3})|((\.|%2e){3,3})|((\.|%2e){2,2})(/|%2f|%u2215)) [NC,OR]
	RewriteCond %{QUERY_STRING} (benchmark|char|exec|fopen|function|html)(.*)(\(|%28)(.*)(\)|%29) [NC,OR]
	RewriteCond %{QUERY_STRING} (php)([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) [NC,OR]
	RewriteCond %{QUERY_STRING} (e|%65|%45)(v|%76|%56)(a|%61|%31)(l|%6c|%4c)(.*)(\(|%28)(.*)(\)|%29) [NC,OR]
	RewriteCond %{QUERY_STRING} (/|%2f)(=|%3d|$&|_mm|cgi(\.|-)|inurl(:|%3a)(/|%2f)|(mod|path)(=|%3d)(\.|%2e)) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3c)(.*)(e|%65|%45)(m|%6d|%4d)(b|%62|%42)(e|%65|%45)(d|%64|%44)(.*)(>|%3e) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3c)(.*)(i|%69|%49)(f|%66|%46)(r|%72|%52)(a|%61|%41)(m|%6d|%4d)(e|%65|%45)(.*)(>|%3e) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3c)(.*)(o|%4f|%6f)(b|%62|%42)(j|%4a|%6a)(e|%65|%45)(c|%63|%43)(t|%74|%54)(.*)(>|%3e) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3c)(.*)(s|%73|%53)(c|%63|%43)(r|%72|%52)(i|%69|%49)(p|%70|%50)(t|%74|%54)(.*)(>|%3e) [NC,OR]
	RewriteCond %{QUERY_STRING} (\+|%2b|%20)(d|%64|%44)(e|%65|%45)(l|%6c|%4c)(e|%65|%45)(t|%74|%54)(e|%65|%45)(\+|%2b|%20) [NC,OR]
	RewriteCond %{QUERY_STRING} (\+|%2b|%20)(i|%69|%49)(n|%6e|%4e)(s|%73|%53)(e|%65|%45)(r|%72|%52)(t|%74|%54)(\+|%2b|%20) [NC,OR]
	RewriteCond %{QUERY_STRING} (\+|%2b|%20)(s|%73|%53)(e|%65|%45)(l|%6c|%4c)(e|%65|%45)(c|%63|%43)(t|%74|%54)(\+|%2b|%20) [NC,OR]
	RewriteCond %{QUERY_STRING} (\+|%2b|%20)(u|%75|%55)(p|%70|%50)(d|%64|%44)(a|%61|%41)(t|%74|%54)(e|%65|%45)(\+|%2b|%20) [NC,OR]
	RewriteCond %{QUERY_STRING} (\\x00|(\"|%22|\'|%27)?0(\"|%22|\'|%27)?(=|%3d)(\"|%22|\'|%27)?0|cast(\(|%28)0x|or%201(=|%3d)1) [NC,OR]
	RewriteCond %{QUERY_STRING} (g|%67|%47)(l|%6c|%4c)(o|%6f|%4f)(b|%62|%42)(a|%61|%41)(l|%6c|%4c)(s|%73|%53)(=|\[|%[0-9A-Z]{0,2}) [NC,OR]
	RewriteCond %{QUERY_STRING} (_|%5f)(r|%72|%52)(e|%65|%45)(q|%71|%51)(u|%75|%55)(e|%65|%45)(s|%73|%53)(t|%74|%54)(=|\[|%[0-9A-Z]{2,}) [NC,OR]
	RewriteCond %{QUERY_STRING} (j|%6a|%4a)(a|%61|%41)(v|%76|%56)(a|%61|%31)(s|%73|%53)(c|%63|%43)(r|%72|%52)(i|%69|%49)(p|%70|%50)(t|%74|%54)(:|%3a)(.*)(;|%3b|\)|%29) [NC,OR]
	RewriteCond %{QUERY_STRING} (b|%62|%42)(a|%61|%41)(s|%73|%53)(e|%65|%45)(6|%36)(4|%34)(_|%5f)(e|%65|%45|d|%64|%44)(e|%65|%45|n|%6e|%4e)(c|%63|%43)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(.*)(\()(.*)(\)) [NC,OR]
	RewriteCond %{QUERY_STRING} (@copy|\$_(files|get|post)|allow_url_(fopen|include)|auto_prepend_file|blexbot|browsersploit|(c99|php)shell|curl(_exec|test)|disable_functions?|document_root|elastix|encodeuricom|exploit|fclose|fgets|file_put_contents|fputs|fsbuff|fsockopen|gethostbyname|grablogin|hmei7|input_file|null|open_basedir|outfile|passthru|phpinfo|popen|proc_open|quickbrute|remoteview|root_path|safe_mode|shell_exec|site((.){0,2})copier|sux0r|trojan|user_func_array|wget|xertive) [NC,OR]
	RewriteCond %{QUERY_STRING} (;|<|>|\'|\"|\)|%0a|%0d|%22|%27|%3c|%3e|%00)(.*)(/\*|alter|base64|benchmark|cast|concat|convert|create|encode|declare|delete|drop|insert|md5|request|script|select|set|union|update) [NC,OR]
	RewriteCond %{QUERY_STRING} ((\+|%2b)(concat|delete|get|select|union)(\+|%2b)) [NC,OR]
	RewriteCond %{QUERY_STRING} (union)(.*)(select)(.*)(\(|%28) [NC,OR]
	RewriteCond %{QUERY_STRING} (concat|eval)(.*)(\(|%28) [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_QUERY_STRING:%1___%2___%3]
</IfModule>

# 7G:[REQUEST URI]
<IfModule mod_rewrite.c>
	RewriteCond %{REQUEST_URI} (\^|`|<|>|\\|\|) [NC,OR]
	RewriteCond %{REQUEST_URI} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{REQUEST_URI} (=?\\(\'|%27)/?)(\.) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(\*|\"|\'|\.|,|&|&?)/?$ [NC,OR]
	RewriteCond %{REQUEST_URI} (\.)(php)(\()?([0-9]+)(\))?(/)?$ [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(vbulletin|boards|vbforum)(/)? [NC,OR]
	RewriteCond %{REQUEST_URI} /((.*)header:|(.*)set-cookie:(.*)=) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(ckfinder|fck|fckeditor|fullclick) [NC,OR]
	RewriteCond %{REQUEST_URI} (\.(s?ftp-?)config|(s?ftp-?)config\.) [NC,OR]
	RewriteCond %{REQUEST_URI} (\{0\}|\"?0\"?=\"?0|\(/\(|\.\.\.|\+\+\+|\\\") [NC,OR]
	RewriteCond %{REQUEST_URI} (thumbs?(_editor|open)?|tim(thumbs?)?)(\.php) [NC,OR]
	RewriteCond %{REQUEST_URI} (\.|20)(get|the)(_)(permalink|posts_page_url)(\() [NC,OR]
	RewriteCond %{REQUEST_URI} (///|\?\?|/&&|/\*(.*)\*/|/:/|\\\\|0x00|%00|%0d%0a) [NC,OR]
	RewriteCond %{REQUEST_URI} (/%7e)(root|ftp|bin|nobody|named|guest|logs|sshd)(/) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(etc|var)(/)(hidden|secret|shadow|ninja|passwd|tmp)(/)?$ [NC,OR]
	RewriteCond %{REQUEST_URI} (s)?(ftp|http|inurl|php)(s)?(:(/|%2f|%u2215)(/|%2f|%u2215)) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(=|\$&?|&?(pws|rk)=0|_mm|_vti_|cgi(\.|-)?|(=|/|;|,)nt\.) [NC,OR]
	RewriteCond %{REQUEST_URI} (\.)(ds_store|htaccess|htpasswd|init?|mysql-select-db)(/)?$ [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(bin)(/)(cc|chmod|chsh|cpp|echo|id|kill|mail|nasm|perl|ping|ps|python|tclsh)(/)?$ [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(::[0-9999]|%3a%3a[0-9999]|127\.0\.0\.1|localhost|loopback|makefile|pingserver|wwwroot)(/)? [NC,OR]
	RewriteCond %{REQUEST_URI} (\(null\)|\{\$itemURL\}|cAsT\(0x|echo(.*)kae|etc/passwd|eval\(|self/environ|\+union\+all\+select) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)?j((\s)+)?a((\s)+)?v((\s)+)?a((\s)+)?s((\s)+)?c((\s)+)?r((\s)+)?i((\s)+)?p((\s)+)?t((\s)+)?(%3a|:) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(awstats|(c99|php|web)shell|document_root|error_log|listinfo|muieblack|remoteview|site((.){0,2})copier|sqlpatch|sux0r) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)((php|web)?shell|crossdomain|fileditor|locus7|nstview|php(get|remoteview|writer)|r57|remview|sshphp|storm7|webadmin)(.*)(\.|\() [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(author-panel|bitrix|class|database|(db|mysql)-?admin|filemanager|htdocs|httpdocs|https?|mailman|mailto|msoffice|mysql|_?php-my-admin(.*)|tmp|undefined|usage|var|vhosts|webmaster|www)(/) [NC,OR]
	RewriteCond %{REQUEST_URI} (base64_(en|de)code|benchmark|child_terminate|curl_exec|e?chr|eval|function|fwrite|(f|p)open|html|leak|passthru|p?fsockopen|phpinfo|posix_(kill|mkfifo|setpgid|setsid|setuid)|proc_(close|get_status|nice|open|terminate)|(shell_)?exec|system)(.*)(\()(.*)(\)) [NC,OR]
	RewriteCond %{REQUEST_URI} (/)(^$|00.temp00|0day|3index|3xp|70bex?|admin_events|bkht|(php|web)?shell|c99|config(\.)?bak|curltest|db|dompdf|filenetworks|hmei7|index\.php/index\.php/index|jahat|kcrew|keywordspy|libsoft|marg|mobiquo|mysql|nessus|php-?info|racrew|sql|vuln|(web-?|wp-)?(conf\b|config(uration)?)|xertive)(\.php) [NC,OR]
	RewriteCond %{REQUEST_URI} (\.)(7z|ab4|ace|afm|ashx|aspx?|bash|ba?k?|bin|bz2|cfg|cfml?|cgi|conf\b|config|ctl|dat|db|dist|dll|eml|engine|env|et2|exe|fec|fla|git|hg|inc|ini|inv|jsp|log|lqd|make|mbf|mdb|mmw|mny|module|old|one|orig|out|passwd|pdb|phtml|pl|profile|psd|pst|ptdb|pwd|py|qbb|qdf|rar|rdf|save|sdb|sql|sh|soa|svn|swf|swl|swo|swp|stx|tar|tax|tgz|theme|tls|tmd|wow|xtmpl|ya?ml|zlib)$ [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REQUEST_URI:%1___%2___%3]
</IfModule>

# 7G:[USER AGENT]
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_USER_AGENT} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} (<|%0a|%0d|%27|%3c|%3e|%00|0x00) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} (ahrefs|alexibot|majestic|mj12bot|rogerbot) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} ((c99|php|web)shell|remoteview|site((.){0,2})copier) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} (econtext|eolasbot|eventures|liebaofast|nominet|oppo\sa33) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} (base64_decode|bin/bash|disconnect|eval|lwp-download|unserialize|\\\x22) [NC,OR]
	RewriteCond %{HTTP_USER_AGENT} (acapbot|acoonbot|asterias|attackbot|backdorbot|becomebot|binlar|blackwidow|blekkobot|blexbot|blowfish|bullseye|bunnys|butterfly|careerbot|casper|checkpriv|cheesebot|cherrypick|chinaclaw|choppy|clshttp|cmsworld|copernic|copyrightcheck|cosmos|crescent|cy_cho|datacha|demon|diavol|discobot|dittospyder|dotbot|dotnetdotcom|dumbot|emailcollector|emailsiphon|emailwolf|extract|eyenetie|feedfinder|flaming|flashget|flicky|foobot|g00g1e|getright|gigabot|go-ahead-got|gozilla|grabnet|grafula|harvest|heritrix|httrack|icarus6j|jetbot|jetcar|jikespider|kmccrew|leechftp|libweb|linkextractor|linkscan|linkwalker|loader|masscan|miner|mechanize|morfeus|moveoverbot|netmechanic|netspider|nicerspro|nikto|ninja|nutch|octopus|pagegrabber|petalbot|planetwork|postrank|proximic|purebot|pycurl|python|queryn|queryseeker|radian6|radiation|realdownload|scooter|seekerspider|semalt|siclab|sindice|sistrix|sitebot|siteexplorer|sitesnagger|skygrid|smartdownload|snoopy|sosospider|spankbot|spbot|sqlmap|stackrambler|stripper|sucker|surftbot|sux0r|suzukacz|suzuran|takeout|teleport|telesoft|true_robots|turingos|turnit|vampire|vikspider|voideye|webleacher|webreaper|webstripper|webvac|webviewer|webwhacker|winhttp|wwwoffle|woxbot|xaldon|xxxyy|yamanalab|yioopbot|youda|zeus|zmeu|zune|zyborg) [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_USER_AGENT:%1]
</IfModule>

# 7G:[REMOTE HOST]
<IfModule mod_rewrite.c>
	RewriteCond %{REMOTE_HOST} (163data|amazonaws|colocrossing|crimea|g00g1e|justhost|kanagawa|loopia|masterhost|onlinehome|poneytel|sprintdatacenter|reverse.softlayer|safenet|ttnet|woodpecker|wowrack) [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REMOTE_HOST:%1]
</IfModule>

# 7G:[HTTP REFERRER]
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC,OR]
	RewriteCond %{HTTP_REFERER} (order(\s|%20)by(\s|%20)1--) [NC,OR]
	RewriteCond %{HTTP_REFERER} (blue\spill|cocaine|ejaculat|erectile|erections|hoodia|huronriveracres|impotence|levitra|libido|lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby|ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo) [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_HTTP_REFERRER:%1]
</IfModule>

# 7G:[REQUEST METHOD]
<IfModule mod_rewrite.c>
	RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|trace|track) [NC]
	RewriteRule .* - [F,L]
	# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REQUEST_METHOD:%1]
</IfModule>

5.1 – Falls Probleme mit der 7G auftauchen, nutze die 6G-Firewall [2020]

In einigen wenigen Fällen kann es zu Problemen bei der Nutzung der 7G-Firewall geben. Sie läuft trotz einer ausreichenden Testphase nicht auf allen Websites ohne Fehler. Sollten Probleme auftauchen, nutze stattdessen die 6G-Firewall der neuesten Version. Der Link zum Artikel von Jeff Starr mit dem Code: 6G Firewall 2020.

# 6G FIREWALL/BLACKLIST Version 2020
# @ https://perishablepress.com/6g/

# 6G:[QUERY STRING]
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
	RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
	RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
	RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR]
	RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
	RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
	RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
	RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
	RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
	RewriteRule .* - [F]
</IfModule>

# 6G:[REQUEST METHOD]
<IfModule mod_rewrite.c>
	RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
	RewriteRule .* - [F]
</IfModule>

# 6G:[REFERRER]
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC]
	RewriteRule .* - [F]
</IfModule>

# 6G:[REQUEST STRING]
<IfModule mod_alias.c>
	RedirectMatch 403 (?i)([a-z0-9]{2000,})
	RedirectMatch 403 (?i)(https?|ftp|php):/
	RedirectMatch 403 (?i)(base64_encode)(.*)(\()
	RedirectMatch 403 (?i)(=\\\'|=\\%27|/\\\'/?)\.
	RedirectMatch 403 (?i)/(\$(\&)?|\*|\"|\.|,|&|&?)/?$
	RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")
	RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|)
	RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|muieblack)
	RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
	RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$
	RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>

# 6G:[USER AGENT]
<IfModule mod_setenvif.c>
	SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot
	SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot
	
	# Apache < 2.3
	<IfModule !mod_authz_core.c>
		Order Allow,Deny
		Allow from all
		Deny from env=bad_bot
	</IfModule>

	# Apache >= 2.3
	<IfModule mod_authz_core.c>
		<RequireAll>
			Require all Granted
			Require not env bad_bot
		</RequireAll>
	</IfModule>
</IfModule>

6 – 7G Addon gegen das aggressive Scannen von Upload-Dateien

Dieses kleine Addon stoppt die zum Teil sehr aggressiven Angriffe auf Uploads-relevante Ziele, die sich hauptsächlich auf Uploadify, Plupload, TimThumb und ähnliches konzentrieren. Doch auch gegen normale WP-Dateien richten sich die Angriffe, wie zum Beispiel wp-config.php und die xmlrpc.php. Das Addon stoppt über 90% dieser Angriffe.

# 7G Addon: Stop Aggressive Scanning for Uploads-Related Targets
# https://perishablepress.com/stop-aggressive-scanning-uploads/
<IfModule mod_rewrite.c>

	# RewriteCond %{REQUEST_URI} /php(unit)?/ [NC,OR]
	# RewriteCond %{REQUEST_URI} \.(aspx?|env|git(ignore)?|phtml|rar|well-known) [NC,OR]
	# RewriteCond %{REQUEST_URI} /(cms|control_panel|dashboard|home_url=|lr-admin|manager|panel|staff|webadmin) [NC,OR]
	# RewriteCond %{REQUEST_URI} /(adm(in)?|blog|cache|checkout|controlpanel|ecommerce|export|magento(-1|web)?|market(place)?|mg|onli(n|k)e|orders?|shop|tmplconnector|uxm|web?store)/ [NC,OR]
	
	RewriteCond %{REQUEST_URI} (_timthumb_|timthumb.php) [NC,OR]
	RewriteCond %{REQUEST_URI} /(install|wp-config|xmlrpc)\.php [NC,OR]
	RewriteCond %{REQUEST_URI} /(uploadify|uploadbg|up__uzegp)\.php [NC,OR]
	RewriteCond %{REQUEST_URI} /(comm\.js|mysql-date-function|simplebootadmin|vuln\.htm|www\.root\.) [NC,OR]
	RewriteCond %{REQUEST_URI} /(admin-uploadify|fileupload|jquery-file-upload|upload_file|upload|uploadify|webforms)/ [NC,OR]
	RewriteCond %{REQUEST_URI} /(ajax_pluginconf|apikey|connector(.minimal)?|eval-stdin|f0x|login|router|setup-config|sssp|vuln|xattacker)\.php [NC]
	
	RewriteRule .* - [F,L]
	
</IfModule>

7 – WordPress-Dateien gegen Zugriff blocken

Dieser Bereich sperrt den Zugriff von außen auf so extrem wichtige und sensible Dateien wie die wp-config.php, die install.php und den sehr gefährdeten wp-includes Ordner.

# No access to the install.php
<files install.php>
Order allow,deny
Deny from all
</files>
 
# No access to the wp-config.php 
<files wp-config.php>
Order allow,deny
Deny from all
</files>
 
# No access to the readme.html
<files readme.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</Files>
 
# No access to the liesmich.html for DE Edition
<Files liesmich.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</Files>
 
# No error log access 
<files error_log>
Order allow,deny
Deny from all
</files>

#No access to the .htaccess und .htpasswd
<FilesMatch "(\.htaccess|\.htpasswd)">
  Order deny,allow
  Deny from all
</FilesMatch>

# Block access to includes folder
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

8 – Hotlink Protection gegen Bildklau

Das Hotlinking verhindert, dass Deine Bilder auf anderen Websites verlinkt werden können und somit die Ressourcen Deines Webhostings negativ beeinflussen. Mit diesem Schutz werden Deine Bilder nur dort angezeigt, wo sie es auch sollen. Auf Deiner Website. Du musst nur das Wort »domain« in Zeile 6 gegen Deine Domain tauschen. Bei mir steht dort andreas-hecht.

Ich bitte zu beachten, dass mit dieser Einstellung keine Bilder beim Teilen der Beiträge in den Sozialen Medien angezeigt werden.
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{HTTP_REFERER}     !^$
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$           [NC]
 RewriteCond %{HTTP_REFERER}     !^https?://([^.]+\.)?domain\. [NC]
 RewriteRule \.(gif|jpe?g?|png)$                             - [F,NC,L]
</ifModule>

9 – Autoren-Scans blockieren

Hier werden Bots blockiert, die alle WordPress-Websites nach den Usernamen der Autoren scannen, um im Anschluss diese Websites anzugreifen. Dankeschön für den Code an Kommentator Andreas.

#Block WordPress Author Scans

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/users [OR]
RewriteCond %{QUERY_STRING} (author=\d+) [NC]
RewriteRule ^ – [NC,F,L]
</ifModule>

10 – Schutz gegen den »ReallyLongRequest« Banditen

Der »ReallyLongRequest« Bandit ist eine recht neue Bedrohung, die nicht direkt schädlich ist, sondern den Server mit gigantisch vielen Anfragen „erschlagen“ will. Das kann unter Umständen dazu führen, dass Deine Website extrem langsam wird oder nicht mehr erreichbar ist.

»ReallyLongRequest« Bandit heißt der Bot deshalb, weil die gigantisch langen Anfragen alle mit »YesThisIsAReallyLongRequest…« beginnen. Um den Server zu entlasten, blockieren wir diese nutzlosen Anfragen.

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} .* [NC]
    RewriteCond %{THE_REQUEST}  (YesThisIsAReallyLongRequest|ScanningForResearchPurpose) [NC,OR]
    RewriteCond %{QUERY_STRING} (YesThisIsAReallyLongRequest|ScanningForResearchPurpose) [NC]
    RewriteRule .* - [F,L]
</IfModule>

11 – Schütze Deinen Adminbereich mittels HTTP-Veriegelung

Mit der Kombination aus .htaccess und .htpasswd erzeugst Du einen sehr wirksamen Schutz gegen das Hacking Deines Adminbereichs. Du musst nur den Pfad zu Deiner .htpasswd anpassen.

# If you want to use it, comment it out and set your path to .htpasswd
#<Files wp-login.php>
#AuthName "Admin-Bereich"
#AuthType Basic
#AuthUserFile /usr/local/www/apache24/your-path/your-domain.com/.htpasswd 
#require valid-user
#</Files>

12 – Die XML-RPC Datei sperren

Die XML-RPC Datei ist zusammen mit dem Adminbereich von WordPress das beliebteste Angriffsziel.

Die Schnittstelle ist ein nützliches Werkzeug für die Verwaltung von Inhalten. Sie dient dazu, dass man mittels der Desktop– und der Smartphone-Apps die Website verwalten und Artikel verfassen kann. Ebenso kümmert sie sich um Pingbacks. Die Pingback-API ermöglicht eine Art »Vernetzung« zwischen den Blogs und dient gleichzeitig als Schnittstelle, um WordPress über externe Programmen verwalten zu können.

Genau diese Funktionen sorgen für teilweise wesentlich heftigere Angriffsorgien als auf den Adminbereich selbst. Denn auch über die Schnittstelle haben Angreifer dann vollen Zugriff auf die Website.

### @see https://digwp.com/2009/06/xmlrpc-php-security/

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

13 – Der Referrer Header für mehr Datenschutz

Wenn Du auf einen Link klickst, sendet Dein Browser den Header HTTP Referrer an den Webserver, auf dem sich die Zielwebseite befindet. Der Header enthält die vollständige URL der Seite, von der Du gekommen bist. So können Websites sehen, wo der Traffic herkommt. Der Header wird auch gesendet, wenn externe Ressourcen (z. B. Bilder, Schriftarten, JS und CSS) geladen werden.

Der Referrer-Header ist ein Albtraum für die Privatsphäre, da Websites und Dienste Dich über das Internet verfolgen und Deine Surfgewohnheiten (und somit möglicherweise private, vertrauliche Informationen) erkennen können, insbesondere in Verbindung mit Cookies.

Angenommen, Du bist bei Facebook angemeldet. Du besuchst eine Seite mit der URL http://www.some-hospital.com/some-medical-condition. Auf dieser Seite klickst Du auf einen Link zu Deinem Facebook-Profil. Dein Browser sendet dann Referrer: http://www.some-hospital.com/some-medical-condition zu www.facebook.com, zusammen mit Deinen Facebook-Cookies, so dass Facebook Deine Identität mit dieser bestimmten Seite verknüpfen kann.

Das Problem wird noch verschlimmert durch die Tatsache, dass viele Webseiten Ressourcen wie Bilder und Skripte von Dutzenden von Drittanbietern laden, indem sie alle Informationen an sie senden, wobei der typische Besucher keine Ahnung hat, dass dies geschieht.

Gut ist, dass dieser datenschutzrechtliche SuperGau unterbunden werden kann durch den einfachen Befehl an den Browser, keinen Referrer zu senden.

## No-Referrer-Header
<IfModule mod_headers.c>
    Header set Referrer-Policy "no-referrer"
</IfModule>

14 - Die HTTP-Security-Header - Update 05/2022

Jedes Mal, wenn ein Browser eine Seite von einem Webserver anfordert, antwortet der Server mit der Auslieferung der Seite und sendet einen HTTP-Response-Header mit dem Inhalt. Diese Header können nicht nur alltägliche Dinge wie den Zeichensatz enthalten, sondern auch sicherheitsrelevante Einstellungen senden.

Hierfür nutzt man die sogenannten HTTP-Response-Header, mit denen man das Verhalten eines Browsers steuern kann. Ein Strict-Transport-Security-Header würde dem Browser zum Beispiel die Anweisung erteilen, nur über HTTPS zu kommunizieren.

### @see https://scotthelme.co.uk/hardening-your-http-response-headers

## X-FRAME-OPTIONS-Header
<IfModule mod_headers.c>
    Header set X-Frame-Options "sameorigin"
</IfModule>

## Strict Origin when cross origin Header
#@see https://scotthelme.co.uk/a-new-security-header-referrer-policy/
<IfModule mod_headers.c>
    Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

## X-XSS-PROTECTION-Header
<IfModule mod_headers.c>
    Header set X-XSS-Protection "1; mode=block"
</IfModule>

## X-Content-Type-Options-Header
<IfModule mod_headers.c>
    Header set X-Content-Type-Options "nosniff"
</IfModule>

## Strict-Transport-Security-Header - für HTTPS
<IfModule mod_headers.c>
   Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>

# Upgrade Insecure Requests to prevent mixed content
<ifModule mod_headers.c>
  Header always set Content-Security-Policy "upgrade-insecure-requests"
</IfModule>

# Permissions Policy is a new header that allows a site to control which features and APIs can be used in the browser.
<IfModule mod_headers.c>
Header always set Permissions-Policy "geolocation=(), midi=(),sync-xhr=(),accelerometer=(), gyroscope=(), magnetometer=(), camera=(), fullscreen=(self)"
</IfModule>

Der Expect-CT Header

12/2022: Entfernt, weil veraltet.

Der Security Header "upgrade-insecure-requests"

Der "upgrade-insecure-requests"-Header ist für die Sicherheit des Inhalts einer Website gedacht, um Browsern mitzuteilen, dass sie ausschliesslich HTTPS- statt HTTP-Anfragen stellen sollen. Er behebt zum Beispiel auch Probleme mit gemischten Inhalten bei der Umstellung auf HTTPS. (Gemischte Inhalte: Website wird über HTTPS abgerufen, Bilder und Grafiken jedoch noch über HTTP).

Er kann als HTTP-Header oder als Meta-Tag auf Seitenebene verwendet werden.

Beispiel 1: Der HTTP-Header in der .htaccess

#HTTP Header
<ifModule mod_headers.c>
  Header always set Content-Security-Policy "upgrade-insecure-requests;"
</IfModule>


Beispiel 2:
Der Meta-Tag

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

Der neue Permissions-Policy Header

Der Permissions-Policy Header (früher Feature-Policy genannt) steuert die Browser-Funktionen, die für den Datenschutz und die Sicherheit der Besucher infrage kommen. Das meint zum Beispiel das Einschalten von Mikrofon und Webcam, den Standort des Besuchers abzufragen ebenso wie die Aktivierung der Zahlungs-API für Funktionen wie zum Beispiel ApplePay.

Die hier angegebenen Regeln gelten nicht nur für die eigene Website, sondern schließen auch externe Iframes ein, damit auch diese die sicherheitsrelevanten Funktionen nicht nutzen können. Das sorgt für ein deutliches Plus an Sicherheit für die eigene Website. Der neue Header verhindert somit Angriffe, die es auf die Daten Deiner Besucher abgesehen haben.

Mit den Einstellungen in der .htaccess sind alle Funktionen abgeschaltet.

# Permissions Policy is a new header that allows a site to control which features and APIs can be used in the browser.
<IfModule mod_headers.c>
Header always set Permissions-Policy "geolocation=(), midi=(),sync-xhr=(),accelerometer=(), gyroscope=(), magnetometer=(), camera=(), fullscreen=(self)"
</IfModule>

Ein Tutorial dazu kannst Du auf GitHub finden (EN)

15 - Die WordPress Standard Regeln

Dies sind die Standard-Regeln, die jede WordPress-Website während der Installation anlegt. Wenn Du eine Multisite nutzt, oder sich dein WordPress in einem Unterordner befindet, müssen diese Regeln angepasst werden.

Update der Standardregeln auf WordPress ab Version 6

RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

Die WordPress .htaccess als Zip-Datei zum Download

Wichtig: Die Datei ist eine versteckte / Systemdatei und deshalb eventuell nach dem Download und dem Entpacken der ZIP-Datei nicht sichtbar. Du musst dann die Anzeige von versteckten Dateien in Deinem Betriebssystem erst aktivieren.

Ist Dir die .htaccess eine kleine Spende wert?

Spende mit PayPal

Kategorie: WordPress
Andreas Hecht

Andreas Hecht

Andreas ist der Gründer und CEO der SEO Agentur Hamburg und Experte für Suchmaschinenoptimierung und WordPress Entwicklung.

Du bist auf der Suche nach einer seriösen SEO Agentur?

Dir hat unser Artikel gefallen und Du möchtest unsere Hilfe in Anspruch nehmen? Dann melde dich bei unverbindlich bei uns. Wir freuen uns auf Deine Anfrage!

Jetzt weitere interessante Beiträge lesen

322 Kommentare. Hinterlasse eine Antwort

  • Hallo Andreas,
    seit einiger Zeit zeigt mir WordPress folgende „empfohlene Verbesserung“ an:

    Seiten-Cache kann wegen eines möglichen Loopback-Anfrageproblems nicht erkannt werden. Bitte überprüfe, ob der Loopback-Anforderungstest erfolgreich ist. Fehler: Forbidden (Code: http_403)
    Der Seiten-Cache verbessert die Geschwindigkeit und Leistung deiner Website, indem er statische Seiten speichert und bereitstellt, anstatt bei jedem Besuch eines Benutzers eine Seite aufzurufen.
    Seiten-Cache wird erkannt, indem nach einem aktiven Seiten-Cache-Plugin gesucht wird, drei Anfragen an die Homepage gestellt werden und nach einem oder mehreren der folgenden HTTP-Client-Cache-Antwort-Header gesucht wird:
    cache-control, expires, age, last-modified, etag, x-cache-enabled, x-cache-disabled, x-srcache-store-status, x-srcache-fetch-status.

    Ein cache-Plugin habe ich nicht installiert, weil ich deine .htaccess benutze.
    Soll ich irgendwas unternehmen oder kann ich die Meldung ignorieren?

    Gruß Heiko

    Antworten
    • Andreas Hecht
      28. Dezember 2022 16:32

      Hallo Heiko,

      das kannst Du getrost ignorieren. Allerdings könnte ein zusätzliches Cache-Plugin Deine Website noch weiter beschleunigen.

      Antworten
  • Einfach klasse, bisher habe ich mir diverse Snippets selbst zusammengesucht. Hier ist alles drin. Allerdings verstehe ich von der Firewall nichts. Da vertraue ich einfach mal.
    Vielen Dank.
    Spende kommt.

    Antworten
  • Hallo Andreas, heute habe ich durch Zufall festgestellt, dass meine bzw. die von dir geschriebene .htaccess um eine Uhrzeit an dem ich selbst nicht am Server bzw. an der Datei gearbeitet habe Veränderungen geschrieben worden. Dazu habe ich inzwischen gelesen, dass WordPress beispielsweise bei Permalinks Anpassungen in die .htaccess schreibt. Sollte ich das so belassen? Oder empfiehlst du beispielsweise den Zugriff über die Zugriffsrechte 444 zu sperren?

    Danke im Voraus für deine Mühen!
    Beste Grüße Rüdiger

    Antworten
  • Gegen WordPress user enumeration- ja wordpress leaked by default die usernames. Einfach mal selbst ausprobieren, https://www.example.com/wp-json/wp/v2/users (https://www.example.com/wp-json/wp/v2/users)

    # Block WordPress Author Scans

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/users [OR]
    RewriteCond %{QUERY_STRING} (author=\d+) [NC]
    RewriteRule ^ – [NC,F,L]

    Antworten
    • Andreas Hecht
      5. Dezember 2022 15:35

      Hi Andreas,

      danke für Deine Ergänzung. Ich werde Sie einmal ausgiebig testen und eventuell implementieren.

      Antworten
  • Hallo Andreas,
    vielen Dank für die Bereitstellung und Pflege deiner .htacess Datei! Beim lesen der vielen Kommentare ist mir aufgefallen, dass sehr viele Berufskollegen/innen deine .htacess Datei nutzen und loben. Ich komme nicht aus der Branche und versuche mich so gut wie möglich in die Materie einzuarbeiten.
    In den letzten Tagen stosse ich beim überprüfen meiner Site-Sicherheit wiederholt auf nachstehende Meldung. Mir ist noch nicht klar wie ernst ich die Meldungen nehmen muss und ob wirklich dringender Handlungsbedarf besteht!?

    Meldungen:

    PageSpeed Insights:
    Sicherstellen, dass CSP effektiv gegen XSS-Angriffe wirkt

    Die Direktive „script-src“ fehlt. Dies kann die Ausführung unsicherer Skripts ermöglichen.
    script-src
    Hoch
    Wenn „object-src“ fehlt, können Plug-ins eingeschleust werden, die unsichere Skripts ausführen. Sie sollten daher „object-src“ auf „none“ setzen.
    object-src
    Hoch

    Mozilla Observatory:
    Content Security Policy
    -20
    Content Security Policy (CSP) implemented unsafely.
    This includes ‚unsafe-inline‘ or data: inside script-src, overly broad sources such as https: inside object-src or script-src, or not restricting the sources for object-src or script-src.

    siwecos.de:
    Content Security Policy unsicher:
    Die Anweisung default-src fehlt.
    Referrer Policy unsicher:
    Die Anweisung ’strict-origin-when-cross-origin‘ ist gesetzt. Wir empfehlen die Option ’no-referrer‘.

    Nimmt deine .htacess die aufgezeigten Empfehlungen schon auf?
    Bzw. ist es wichtig für mich sich darum zu kümmern? Würde ich bei Bedarf Hilfe von dir, deiner Agentur bekommen? Zum Thema CSP habe ich bereits in den Kommentaren gelesen, das es eine individuelle Anpassung sein müsste.
    Besten Dank! Und beste Grüße
    Rüdiger

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.