Trick # 600 | Dieser Beitrag beinhaltet 1598 Wörter. – Geschätzte Lesezeit: ca. 8 Minuten.
Willkommen zum 600. Beitrag von Dr. Code – ein wenig stolz sind wir schon! Zur Feier des Tages präsentieren wir Ihnen heute ein echtes Highlight: ein WordPress-Skript, das die Website nicht nur sicherer, sondern auch benutzerfreundlicher macht. Mit Geo-Blocking, mit Pflicht-Login und doch mit automatischem Zugang für die Usability.
Das kann das Script:
- Freier Website-Zugang für IP-Whitelisted User: User von bestimmten IP-Adressen erhalten quasi einen VIP-Zugang und können automatisch zugreifen – ohne Eingabe des Passwort s. Praktisch vertrauenswürdige Partner. Admins der Website können die WhiteList jederzeit administrieren und IPs, die länger nicht mehr auf die Website zugegriffen haben, werden nach einer Weile automatisch gelöscht.
- Login-Zwang für alle anderen: Alle User, welche nicht von einer der authentifizierten IPs zugreifen, landen zunächst mal auf der Login-Seite. Die Sicherheitsstandards Ihrer Website bleiben somit intakt. Beim Schliessen des Browsers werden User überdies ausgeloggt. Die Option «Angemeldet bleiben» ist deaktiviert.
- Geo-Blocking: Die Website ist nur für User aus bestimmten Ländern zugänglich (z. B. nur aus der Schweiz).
Das Beste daran: Alles kann nahtlos in WordPress integriert und kinderleicht konfiguriert werden. Let’s start!
Dieser Hack vereint Funktionalität und Sicherheit in einem Script.
Einige Login-und Security-Goodies, die Dr. Code in den letzten Monaten vorgestellt hat, sind enthalten::
- Sicher ist sicher: WordPress-Website mit Geo-Blocking schützen
- WordPress: Login-Zwang für bestimmte IPs deaktivieren
- Login-Special – Trick #3: Website nur eingeloggten Usern anzeigen
Diese Einzelhacks mussten für den heutigen Gesamt-Trick leicht angepasst werden, da sie sich ansonsten teilweise gegenseitig in die Quere kommen könnten.
Den folgenden (zugegebenermassen umfangreichen) Block kopieren Sie in Ihre Datei functions.php. Diese finden Sie im Backend Ihrer WordPress-Website unter Design/Theme-Datei-Editor:
// Zugriffskontrolle der Website
// Zugang nur für eingeloggte Benutzer gewähren, ausser für IPs in der Whitelist
function restrict_access_to_logged_in_users() {
// IP-Whitelist prüfen
$whitelist = get_option('admin_ip_whitelist', []);
$current_ip = $_SERVER['REMOTE_ADDR'];// Geo-Blocking durchführen, unabhängig von Login-Status oder Whitelist
if (!is_allowed_country()) {
wp_die('Access restricted to users in allowed countries only.');
}// Wenn die IP nicht in der Whitelist ist und der Benutzer nicht eingeloggt ist
if (!isset($whitelist[$current_ip]) && !is_user_logged_in() && !is_page('userlogin') && !is_page('register')) {
// Umleitung zur Login-Seite
wp_redirect(wp_login_url());
exit;
}// Wenn die IP in der Whitelist ist, keine Umleitung und kein Login erforderlich
if (isset($whitelist[$current_ip])) {
// Aktualisiere den Zeitstempel für den letzten Zugriff
$whitelist[$current_ip] = time();
update_option('admin_ip_whitelist', $whitelist);
return; // Zugriff ohne Einschränkungen gewähren
}
}
add_action('template_redirect', 'restrict_access_to_logged_in_users');// Nach Login auf die Startseite umleiten
function redirect_after_login($redirect_to, $request, $user) {
if (isset($user->roles) && is_array($user->roles)) {
return home_url(); // Umleitung auf die Startseite
}
return $redirect_to;
}
add_filter('login_redirect', 'redirect_after_login', 10, 3);// Sicherstellen, dass Sitzungen nicht gespeichert werden und beim Schliessen des Browsers beendet werden
function set_session_lifetime() {
ini_set('session.cookie_lifetime', 0); // Sitzung endet mit dem Schliessen des Browsers
ini_set('session.gc_maxlifetime', 0);
}
add_action('init', 'set_session_lifetime', 1);// Entferne die Option "Angemeldet bleiben" auf der Login-Seite
function remove_remember_me_option() {
echo '<style>.login #rememberme, .login label[for="rememberme"] { display: none; }</style>';
}
add_action('login_head', 'remove_remember_me_option');// Geo-Blocking: Zugriff nur aus der Schweiz erlauben
function is_allowed_country() {
$allowed_country = 'CH'; // Schweiz
$user_ip = $_SERVER['REMOTE_ADDR'];
$geo_data = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$user_ip}"));return isset($geo_data->geoplugin_countryCode) && $geo_data->geoplugin_countryCode === $allowed_country;
}// Admin IP-Whitelist-Seite
add_action('admin_menu', function () {
add_options_page('Admin IP Whitelist', 'Admin IP Whitelist', 'manage_options', 'admin-ip-whitelist', 'render_ip_whitelist_page');
});// Administrations-Seite erstellen
function render_ip_whitelist_page() {
if (!current_user_can('manage_options')) {
return;
}$whitelist = get_option('admin_ip_whitelist', []);
$current_ip = $_SERVER['REMOTE_ADDR'];clean_old_ips();if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_ip'])) {
$new_ip = sanitize_text_field($_POST['new_ip']);
if (filter_var($new_ip, FILTER_VALIDATE_IP) && !isset($whitelist[$new_ip])) {
$whitelist[$new_ip] = time();
update_option('admin_ip_whitelist', $whitelist);
}
}if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['remove_ip'])) {
$remove_ip = sanitize_text_field($_POST['remove_ip']);
unset($whitelist[$remove_ip]);
update_option('admin_ip_whitelist', $whitelist);
}// Whitelist nach Alter sortieren (neueste zuerst)
uasort($whitelist, function($a, $b) {
return $b - $a; // Neueste zuerst
});echo '<div class="wrap">';
echo '<h1>Admin IP-Whitelist</h1>';
echo '<form method="post">';
echo '<h2>IP-Whitelist</h2>';
echo '<table class="widefat striped"><thead><tr><td>IP</td><td>Letzter Zugriff</td><td></td></tr></thead>';
foreach ($whitelist as $ip => $timestamp) {
// Datum und Zeit in Ortszeit basierend auf WordPress-Einstellungen formatieren
$last_access = date_i18n('d.m.Y H:i', $timestamp);
echo "<tr><td style=\"width: 33%; vertical-align: middle;\"><b>$ip</b></td><td style=\"width: 33%; vertical-align: middle;\">$last_access </td><td style=\"width: 33%; vertical-align: middle;\"><button class=\"button button-primary\" type='submit' name='remove_ip' value='$ip'>IP entfernen</button></td></tr>";
}
echo '</table>';
echo '<hr>';
echo '<h2>Aktuelle IP</h2>';
echo "<table class=\"widefat striped\"><tr><td style=\"width: 33%; vertical-align: middle;\">Ihre aktuelle IP:<br />$current_ip</td><td style=\"width: 66%; vertical-align: middle;\">";
echo '<input type="hidden" name="new_ip" value="' . esc_attr($current_ip) . '">';
echo '<button class="button button-primary" type="submit" name="add_ip">IP whitelisten</button></td></tr></table>';
echo '</form>';
echo '</div>';
}// Alte IPs nach drei Monaten entfernen
function clean_old_ips() {
$whitelist = get_option('admin_ip_whitelist', []);
$three_months_ago = time() - (3 * 30 * DAY_IN_SECONDS); // Drei Monateforeach ($whitelist as $ip => $timestamp) {
if ($timestamp < $three_months_ago) {
unset($whitelist[$ip]);
}
}update_option('admin_ip_whitelist', $whitelist);
}// Tägliche Bereinigung planen
if (!wp_next_scheduled('daily_ip_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_ip_cleanup');
}
add_action('daily_ip_cleanup', 'clean_old_ips');
Blicken wir auf einige Details und Anpassungsmöglichkeiten:
- Auf Zeile 10 ist der Text enthalten, der beim Geo-Blocking in Ländern angezeigt wird, von denen nicht auf die Website zugegriffen werden kann. Der Text kann natürlich angepasst werden.
- Ab Zeile 26 kontrolliert das Script die IP, von der ein Aufruf kommt. Ist die IP authentifiziert (das können Sie im Backend unter «Einstellungen/Admin IP-Whitelist» bestimmen), wird der User automatisch auf den Website-Inhalt weitergeleitet. Wenn die IP nicht auf der WhiteList steht, geht’s zum Login-Formular.
- Ab Zeile 39 wird festgelegt, dass User beim Schliessen des Browsers automatisch ausgeloggt werden. Die Login-Option «Angemeldet bleiben» ist deaktiviert.
- Anschliessend folgt die eigentliche Geo-Blocking-Abfrage. Das Script nennt auf Zeile 54 derzeit nur die Schweiz (CH) als erlaubter Aufrufort.
- In der Folge wird die Einstellungs-Seite für die IP-WhiteList definiert. Um eine IP auf die WhiteList zu setzen, muss dies vom betreffenden Standort aus gemacht werden.
- Alle IPs auf der WhiteList, von denen seit mehr als drei Monaten kein Zugriff mehr erfolgte, werden dann ab Zeile 110 aus der WhiteList gelöscht. Es wird täglich überprüft, ob es Löschkandidaten gibt.
OK. Das Script ist umfangreich und vielfältig. Aber es war mir den Spass allemal wert.
Werbung


