WP-Ban

Popis

Zablokovaným návštěvníkům se namísto vaší stránky zobrazí vlastní zpráva. Můžete blokovat podle IP adresy, rozsahu IP adres, názvu hostitele, user agentu nebo odkazující URL, vyloučit konkrétní adresy z blokování a zjistit, kolikrát se každý zablokovaný návštěvník pokusil o přístup. V celém systému jsou podporovány zástupné znaky.

Vše se nastavuje v sekci Nastavení -> Blokování na třech záložkách: Statistiky pro počítadla pokusů, Nastavení pro seznamy blokovaných adres a možnosti IP návštěvníků a Šablony pro zprávu o zablokování. Plugin vám nedovolí zablokovat adresu, název hostitele ani uživatelský agent, se kterým právě procházíte web, takže zástupný znak, který by vám znemožnil přístup na váš vlastní web, bude při ukládání odmítnut a na obrazovce se zobrazí, který záznam byl zamítnut.

Funkce

  • Blokování podle IP adresy, rozsahu IP adres, názvu hostitele, user agentu nebo odkazující URL
  • Zástupné znaky ve všech seznamech s výjimkou rozsahů IP adres a seznamu vyloučených adres
  • IPv4 a IPv6, včetně rozsahů IPv6
  • Seznam výjimek, který předčí všechny ostatní seznamy
  • Vaše vlastní zablokovaná zpráva ve formě kompletního HTML dokumentu s živým náhledem
  • Tříditelný a stránkovaný přehled toho, kolikrát se každý zablokovaný návštěvník pokusil
  • Ochrana proti omylem provedenému zablokování, která chrání každého, kdo provádí zálohování, nikoli pouze uživatele s názvem „admin“

Dary

Většinu svého volného času jsem věnoval tvorbě, aktualizaci, údržbě a podpoře těchto pluginů. Pokud se vám moje pluginy opravdu líbí a mohli byste mi věnovat pár dolarů, velmi bych to ocenil. Pokud ne, můžete je klidně používat bez jakýchkoli závazků.

Použití

Přejděte na Nastavení -> Zablokovat. Obrazovka obsahuje tři záložky a otevře se na stránce Statistiky.

Na kartě Nastavení vyplňte požadované seznamy. Každý seznam porovnává celou hodnotu, proto v případě částečné shody použijte *: 192.168.1.* zablokuje celý tento blok, EmailSiphon* zablokuje všechny uživatelské agenty začínající tímto názvem.

Rozsahy IP adres se zapisují ve formátu počátek-konec, vždy jeden na řádek. Podporovány jsou jak adresy IPv4, tak IPv6, avšak v rámci jednoho rozsahu nelze tyto dva typy kombinovat.

Karta Šablony obsahuje zakázanou zprávu samostatně, protože se jedná o celý HTML dokument a její umístění pod šest textových polí by způsobilo, že by se obrazovka proměnila v jednu velkou stěnu.

Záložka Statistiky obsahuje počítadla pokusů, zobrazená po dvaceti řádcích, která lze seřadit podle adresy nebo podle počtu pokusů. Zaškrtněte řádky, které chcete vymazat, a použijte hromadnou akci, nebo zaškrtněte Vynulovat všechny statistiky blokování IP adres a celkový součet, abyste začali znovu.

Všechny tři záložky zapisují stejný řádek wp_ban_options, takže uložení údajů v jedné z nich nikdy neovlivní obsah ostatních dvou.

WP-CLI

wp ban list
wp ban list ips
wp ban add ips 192.168.1.100
wp ban add ips '192.168.1.*'
wp ban add ips_range 192.168.1.1-192.168.1.255
wp ban remove ips 192.168.1.100 --yes
wp ban check 192.168.1.55
wp ban stats
wp ban reset --all --yes

Seznamy jsou ips, ips_range, hosts, referers, user_agents a exclude_ips — stejných šest, jaké se zobrazují na záložce Nastavení, a to ve stejném pořadí. Uveďte libovolnou položku obsahující *, jinak se shell pokusí ji rozvinout na názvy souborů.

wp ban check runs the same match every visitor's request runs, against an address you name, and reports whether it would be banned and by which list. Ranges and wildcards cover far more than they look like they do, so this is worth running before you add one and after you have. It writes nothing and counts nothing, so an address you check does not appear in `wp ban stats`.

wp ban remove and `wp ban reset` ask before they act; pass `--yes` in a script.

Dva rozdíly oproti obrazovce. Karta „Nastavení“ odmítá přidat záznam, který odpovídá správci, který jej ukládá, a shell nemá žádného návštěvníka, kterého by chránil, takže příkaz přidá to, co mu zadáte – nejprve si to ověřte. A záložka „Stats“ zobrazuje název hostitele v každém řádku, což příkaz nedělá, protože se jedná o vyhledávání DNS pro každou adresu a obrazovka to zpracovává pouze pro řádky, které zobrazuje.

Filtry

Použijte wp_ban_enabled, chcete-li u některých požadavků přeskočit kontrolu zákazu:

add_filter( 'wp_ban_enabled', function ( $enabled ) {
    return ! defined( 'REST_REQUEST' ) || ! REST_REQUEST;
} );

Použijte wp_ban_denied, abyste provedli jinou akci v případě, že je návštěvník odmítnut:

add_action( 'wp_ban_denied', function ( $ip, $status ) {
    error_log( 'WP-Ban turned away ' . $ip );
}, 10, 2 );

Pomocí wp_ban_capability můžete omezit přístup na úroveň oprávnění jiné než manage_options:

add_filter( 'wp_ban_capability', function ( $capability, $context ) {
    return 'edit_pages';
}, 10, 2 );

Dalšími čtyřmi jsou wp_ban_ipaddress (adresa, ke které je požadavek přiřazen), wp_ban_status_code (HTTP stav, s nímž je stránka zákazu doručena), wp_ban_protect_self (zda je aktivována ochrana proti vlastnímu zablokování) a wp_ban_trust_proxy (zda lze důvěřovat obvyklým hlavičkám přesměrování).

Snímky obrazovky

Instalace

  1. Nainstalujte a aktivujte plugin.
  2. Přejděte na WP-Admin -> Nastavení -> Zablokovat a na záložce Nastavení vyplňte požadované seznamy.
  3. Pokud je váš web umístěn za proxy serverem nebo sítí CDN, nastavte na téže záložce hlavičku IP návštěvníka. Bez tohoto nastavení se každý návštěvník připojuje s adresou proxy serveru, takže blokování podle IP adresy postihne buď všechny, nebo nikoho.

Nejčastější dotazy

U každého návštěvníka se zobrazuje stejná IP adresa, nebo se blokování IP adres neuplatňuje

Váš web je umístěn za reverzním proxy serverem, vyvažovačem zátěže nebo službou CDN, jako je například Cloudflare, a proto WordPress při každém požadavku vidí adresu proxy serveru namísto adresy návštěvníka.

Ve výchozím nastavení WP-Ban důvěřuje pouze REMOTE_ADDR, protože všechny ostatní hlavičky obsahující IP adresu nastavuje klient – bezpodmínečná důvěra v ně by znamenala, že kdokoli by mohl obejít zákaz IP adresy tím, že by při každém požadavku odeslal jinou hodnotu. Existují dva způsoby, jak tuto funkci aktivovat, nejpřísnější je uveden jako první:

  1. Zadejte přesný název hlavičky do pole Hlavička obsahující IP adresu na kartě Nastavení, například HTTP_X_FORWARDED_FOR nebo HTTP_CF_CONNECTING_IP na Cloudflare. Pouze tato hlavička je důvěryhodná a právě tuto možnost je třeba použít. Pokud si nejste jisti, zeptejte se svého poskytovatele hostingu nebo si přečtěte dokumentaci k vaší síti CDN, kterou hlavičku nastavují.
  2. Definujte konstantu v souboru wp-config.php, která důvěřuje standardní sadě přesměrovávacích hlaviček namísto té, kterou si sami zvolíte:
define( 'WP_BAN_TRUST_PROXY', true );

Chcete-li provádět kontrolu pro každý jednotlivý požadavek, použijte filtr. Filtr je ve výchozím nastavení nastaven na konstantu, takže konstanta zůstává funkční a poslední slovo má filtr:

add_filter( 'wp_ban_trust_proxy', function ( $trust ) {
    // Only trust the header when the request really came from your balancer.
    return '10.0.0.5' === $_SERVER['REMOTE_ADDR'];
} );

Pokud před WordPressem není žádný proxy server, nepovolujte ani jednu z těchto možností: obejít tak zákaz přístupu pro jakoukoli IP adresu by pak bylo hračkou. Vždy je bezpečnější pojmenovat ten záhlaví, který nastavuje a přepisuje váš vlastní proxy server, než použít konstantu, která důvěřuje sedmi záhlavím, protože nemůže vědět, které z nich je vaše.

Můj monitorovací nástroj nebo nástroj pro SEO hlásí, že web vrací kód 403

Od verze 2.0.0 je to záměrné. Stránka s oznámením o zákazu přístupu se dříve načítala jako 200 OK, což vyhledávačům a mezipamětím signalizovalo, že se jedná o skutečný obsah vašeho webu. Nyní se načítá jako 403 Forbidden.

Pokud chcete obnovit původní chování:

add_filter( 'wp_ban_status_code', function () {
    return 200;
} );

Kam se mi po aktualizaci na verzi 2.0.0 ztratila nastavení?

Nikde – byla pouze přesunuta, neztratila se. WP-Ban dříve ukládal svá nastavení do osmi samostatných řádků v tabulce možností, a to pod názvy, které vůbec neobsahovaly předponu pluginu. Verze 2.0.0 je sjednotila do jednoho řádku s názvem wp_ban_options. K přesunu dojde automaticky při prvním načtení wp-admin správcem po aktualizaci a zároveň se tím opraví dvě dlouhodobé chyby v úložišti (viz seznam změn).

Rozsah IP adres, který jsem zadal, byl zamítnut

Rozsah musí tvořit dvě platné adresy stejného typu, oddělené pomlčkou, bez zástupných znaků — 192.168.1.1-192.168.1.255 nebo 2001:db8::1-2001:db8::ffff. Jakýkoli jiný záznam bude při ukládání odmítnut a na obrazovce se zobrazí, který záznam byl vyřazen. Před verzí 2.0.0 byl nesprávně zadaný rozsah přijat a následně se na něj vztahovalo každého návštěvníka, takže pokud jste měli takový záznam uložený, byli všichni zablokováni.

Jaké proměnné mohu použít ve zprávě o zablokování?

%SITE_NAME%, %SITE_URL%, %USER_IP%, %USER_HOSTNAME%, %USER_ATTEMPTS_COUNT% a %TOTAL_ATTEMPTS_COUNT%. Vaše zpráva musí být umístěna uvnitř <div id="wp-ban-container"></div>, aby ji tlačítko náhledu mohlo najít.

Co tento plugin ukládá do mé databáze?

Tři řádky: wp_ban_options pro nastavení, wp_ban_version pro verzi, ve které byl plugin naposledy spuštěn, a wp_ban_stats pro počítadla pokusů. Automaticky se načítají pouze první dva. Odstranění pluginu z obrazovky Pluginy odstraní všechny tři, a také všechny řádky starší než verze 2.0.0.

Recenze

20. 4. 2020
I have been searching for a tool to get rid of robot users and their advertising comments at my site’s comment section. This extension worked. It successfully blocked 48 entry from 8 different ip adress within one day. Thanks for providing it
13. 12. 2016
For whatever reasons, I cannot get this plugin to work. I’ve tried banning both an entire IP range, as well as each IP within that range and I am still receiving visitor reports stating that my site is receiving visitors from that range.
3. 9. 2016
Ended up having to remove the plugin since the website broke as a result of a flaw in the most recent update.
Přečtěte si všech 28 recenzí

Autoři

WP-Ban je otevřený software. Následující lidé přispěli k vývoji tohoto pluginu.

Spolupracovníci

Plugin „WP-Ban“ byl přeložen do 5 jazyků. Děkujeme všem překladatelům za jejich pomoc.

Přeložte “WP-Ban” do svého jazyka.

Zajímá vás vývoj?

Prohledejte kód, podívejte se do SVN repozitáře, nebo se přihlaste k odběru protokolu vývoje pomocí RSS.

Přehled změn

2.0.0

  • OPRAVENO: Jedna IP adresa měla několik různých zápisů a seznamy porovnávají řetězce, takže 2001:DB8::1 a 2001:db8::1 byly dva různé záznamy o zablokování a adresa ::ffff:203.0.113.5 namapovaná na IPv4 neodpovídala ani záznamu IPv4, ani rozsahu IPv4. Pokud návštěvník zvolí určitý způsob zápisu, jedná se o obcházení zákazu; pokud tak neučiní, jde o nepozorované selhání, protože server s duálním stackem, který hlásí REMOTE_ADDR v mapované podobě, se nikdy neshodoval s prostou adresou IPv4, kterou její majitel zadal. Adresy jsou nyní kanonizovány
  • OPRAVENO: Zpráva o zablokování může obsahovat prvek <style> — ten v dodané verzi ho obsahuje — a kses se nezabývá CSS, ale pouze značkovacím jazykem. V prostředí multisite má správce webu oprávnění manage_options a záměrně nemá oprávnění unfiltered_html, aby mohl zajistit, že každý zablokovaný návštěvník načte stylový list podle svého výběru. Funkce @import a url() jsou nyní odstraněny z uloženého CSS pro všechny, kteří nemají tuto oprávnění; vše ostatní v pravidlech zůstává beze změny
  • OPRAVENO: Z levé části, kam návštěvník zapisuje, byla načtena hlavička přesměrování. Každý proxy přidává — v nginxu $proxy_add_x_forwarded_for je doslova "$http_x_forwarded_for, $remote_addr" — takže zablokovaný návštěvník na webu, který tuto hlavičku pojmenoval, mohl odeslat libovolnou adresu a obejít tak zablokování. Ještě horší je, že seznam vyloučených adres provádí přesné porovnání s touto hodnotou, takže odeslání vyloučené adresy obejde všechny seznamy najednou, včetně blokování hostitelů, odkazujících stránek a user-agentů. Řetězec se nyní čte zprava. Web za více než jedním připojeným proxy serverem to oznamuje prostřednictvím wp_ban_trusted_proxy_hops
  • OPRAVENO: Tabulka wp_ban_stats se neustále rozšiřovala o jeden záznam pro každou jedinečnou adresu, přičemž při každém zablokovaném požadavku došlo k deserializaci celého pole, jeho inkrementaci a zpětnému zapsání – náklady na jeden požadavek tak rostly s počtem dosud zaznamenaných adres, přičemž k přístupu k žádné z těchto částí nebylo třeba žádné ověření: návštěvník se přihlásí zasláním zakázaného uživatelského agenta, což vůbec nevyžaduje shodu IP adresy. Přehled si nyní pamatuje pět set adres, které byly odmítnuty nejčastěji, a lze jej upravit pomocí wp_ban_max_tracked_addresses. Celkový počet zůstává nezměněn
  • OPRAVENO: Vzor pro blokování obsahující několik zástupných znaků provádí zpětné prohledávání kvadraticky u dlouhých předmětů, přičemž těmito předměty jsou uživatelský agent a odkazující stránka, které návštěvník zadává – a oba seznamy jsou procházeny při každém požadavku, nejen u těch blokovaných. Před porovnáním je délka předmětů omezena na 2 048 znaků; wp_ban_max_match_length tuto hodnotu upravuje
  • OPRAVENO: Reverzní vyhledávání DNS pro %USER_HOSTNAME% se spouštělo při každém zablokování, bez ohledu na to, zda zpráva tuto proměnnou používala, zatímco v dodané zprávě tomu tak není. O tom, jak dlouho toto blokovací volání trvá, rozhoduje vlastník reverzní zóny dané adresy.
  • AKTUÁLNÍ ZPRÁVA: Vyžaduje WordPress 6.8 a PHP 8.2, místo dosavadních verzí 6.0 a 7.4.
  • AKTUÁLNÍ ZPRÁVA: Hlavičky proxy již nejsou ve výchozím nastavení považovány za důvěryhodné. Pokud je váš web za Cloudflare, vyvažovačem zátěže nebo jakýmkoli reverzním proxy serverem, zadejte název hlavičky, kterou váš proxy server nastavuje, do nového pole Hlavička obsahující IP adresu, nebo definujte WP_BAN_TRUST_PROXY. Viz často kladené otázky.
  • AKTUÁLNÍ ZPRÁVA: Zaškrtávací políčko Tento web je za reverzním proxy bylo odstraněno. Dříve se důvěřovalo libovolnému ze sedmi přeposílaných hlaviček, které náhodou dorazily; zadání názvu konkrétní hlavičky, kterou nastavuje váš proxy server, je bezpečnější a zároveň to odpovídá tomu, co nabízejí čtyři sourozenecké pluginy. Web, u kterého bylo toto políčko zaškrtnuto a nebyl zadán žádný záhlaví, je převeden na HTTP_X_FORWARDED_FOR.
  • AKTUÁLNÍ ZPRÁVA: Stránka se zákazem se nyní zobrazuje jako 403 Forbidden namísto 200 OK. Chcete-li obnovit původní chování, použijte filtr wp_ban_status_code. Viz často kladené otázky.
  • AKTUÁLNÍ ZPRÁVA: Globální funkce z verzí starších než 2.0.0 (banned(), ban_get_ip(), print_banned_message(), process_ban(), is_admin_ip(), preg_match_wildcard() a podobné) byly odstraněny. Byly deklarovány bez předpony a bez podmínek; jakýkoli kód, který je volá, musí být aktualizován.
  • AKTUÁLNÍ ZPRÁVA: Řádky s možnostmi byly přejmenovány. banned_options se nyní jmenuje wp_ban_options, banned_stats se nyní jmenuje wp_ban_stats a ban_db_version je nahrazeno wp_ban_version. Deset řádků z verzí před 2.0.0 je automaticky sloučeno do těchto tří a poté smazáno.
  • NOVINKA: Nastavení byla přesunuta do rozhraní Settings API, do sekce Nastavení -> Zablokovat, kde jsou rozdělena do tří záložek: Statistiky, Nastavení a Šablony. Všechny tři zapisují jeden řádek s volbami a uložení jedné z nich neovlivní ostatní dvě.
  • NOVINKA: Statistiky blokování jsou nyní zobrazeny ve formě tabulky, kterou lze třídit, stránkovat a hromadně mazat. Původní tabulka zobrazovala všechny zaznamenané adresy na jedné stránce.
  • NOVINKA: Jsou podporovány rozsahy adres IPv6.
  • NOVINKA: Nastavení hlavičky obsahující IP adresu, které určuje, které hlavičce lze důvěřovat, spolu s konstantou WP_BAN_TRUST_PROXY a filtrem wp_ban_trust_proxy.
  • NOVINKA: wp_ban_capability, wp_ban_denied, wp_ban_enabled, wp_ban_ipaddress, wp_ban_protect_self a wp_ban_status_code háčky.
  • NOVINKA: Příkazy WP-CLI pro wp ban: list, add, remove, check, stats a reset. wp ban check <ip> oznamuje, zda by byla daná adresa zablokována a na základě kterého seznamu, což je nejrychlejší způsob, jak zjistit, co vlastně zahrnuje zástupný znak nebo rozsah adres.
  • NOVINKA: Upustili jsme od jQuery; administrační skript je napsán v čistém JavaScriptu.
  • NOVINKA: Kontrola zákazu se již neprovádí pro WP-CLI ani pro cron.
  • ZMĚNA: Přestavěno do formátu includes/, přičemž každá třída má předponu WP_Ban_.
  • ZMĚNA: Řádek se statistikami blokovaných adres se již nenačítá automaticky, takže při každém zobrazení stránky se již nenačítá neomezený seznam všech adres, které byly kdy zablokovány.
  • OPRAVENO: Nesprávně zadaný rozsah IP adres vedl k zablokování všech návštěvníků. Funkce ip2long() vrací hodnotu false v případě neanalyzovatelného rozsahu a PHP porovnávalo adresu s touto booleovskou hodnotou jako s hodnotou true.
  • OPRAVENO: Rozsahy adres IPv6 se bez upozornění přiřazovaly k žádnému uživateli.
  • OPRAVENO: Aktivace sítě a odinstalace v režimu více webů končily chybou, protože funkce wp_get_sites() byla ve WordPressu 5.1 odstraněna. Obě funkce nyní procházejí všechny weby, místo aby se zastavily na stém.
  • OPRAVENO: Záznamy o zablokování byly ukládány s HTML-eskapováním, takže vzor referrera obsahující & se nikdy nemohl shodovat se skutečnou hlavičkou Referer a problém se při opětovném uložení ještě zhoršil. Stávající záznamy jsou při aktualizaci opraveny.
  • OPRAVENO: Zpráva o zablokování byla při každém načtení ukládána jak s lomítkem, tak bez něj. Aktualizace opravuje uloženou hodnotu.
  • OPRAVENO: Zákazy se přestaly uplatňovat úplně v případech, kdy byly důvěryhodné hlavičky proxy a žádná z nich nebyla přítomna, nebo když se adresa návštěvníka nacházela v soukromé síti.
  • OPRAVENO: Náhled zprávy o zablokování byl přístupný všem přihlášeným uživatelům, včetně odběratelů. Nyní je k jeho zobrazení nutné mít oprávnění manage_options a zadat jednorázový kód (nonce).
  • OPRAVENO: Ochrana proti vlastnímu zablokování fungovala pouze v případě, že vaše uživatelské jméno bylo doslova „admin“. Nyní chrání každého, kdo provádí uložení.
  • OPRAVENO: Řádek s nastavením nebyl při odinstalaci nikdy odstraněn.
  • OPRAVENO: Plugin již nemá pevně zakódovaný název vlastního adresáře, takže funguje i při instalaci do jakékoli složky.
  • OPRAVENO: Různá varování a zastaralé funkce v PHP 8.