WordSec – Malware Scanner & Removal, Web Application Firewall (WAF), and 2FA

Описание

WordSec is a complete WordPress security plugin. Eight modules cover the firewall, malware scanner, login security, live traffic, IP and country blocking, supply-chain intelligence, audit log and alerts, so you block attacks and harden your site from one dashboard instead of installing eight plugins.

If your site gets hacked you do not just lose the site. You lose customer trust, your search rankings, and days of work restoring backups. WordSec is built to stop that before it happens, and to help you recover if it already has: the scanner finds the malware, quarantine takes it out of the way, and modified core, plugin and theme files are repaired from their original copies.

Free, and no license key to enter. WAF firewall rules, malware and file-integrity scanning, brute force protection, two factor authentication, IP and country blocking, the audit log and one-click hardening all run locally on your own server.

Web Application Firewall (WAF)

  • Custom rule builder with regex and wildcard matching
  • Built-in rules for SQL injection, XSS, path traversal, PHP and command injection
  • Learning and active modes, bot blocking, security headers, rate limiting
  • 25+ hardening toggles for wp-config access, author enumeration and REST API
  • Optional Extended Protection: pre-WordPress request inspection (opt-in, fully reversible)

Malware Scanner and Removal

  • Malware detection rules across files, the database and scheduled tasks
  • Core, plugin and theme file-integrity verification via the WordPress.org API
  • Scheduled scans, one-click quarantine and restore
  • Malware removal on a hacked site: quarantine a finding, or repair a modified core, plugin or theme file from its original copy

Login Security, Two-Factor Authentication (2FA) and Brute Force Protection

  • Role-based two-factor authentication (RFC 6238 TOTP)
  • reCAPTCHA, hCaptcha and Cloudflare Turnstile, plus a built-in math CAPTCHA
  • Brute-force protection with progressive lockout, honeypot and login URL rename
  • Leaked-password checking, session management, custom login page

Живой трафик

  • Real-time request logging with bot detection and CSV export
  • Exclusion filtering by role, IP, country or URI

IP and Country Blocking

  • Списки разрешений или блокировки по странам и континентам
  • IP and CIDR blocking, temporary or permanent, with allow-list support

Supply Chain and Threat Intelligence

  • Reputation scoring and abandoned-plugin detection
  • Known-vulnerability alerts for core, plugins, themes and PHP
  • Update-integrity verification with backups and an SBOM inventory

Журнал аудита

  • Activity tracking across 11 object types and 14 actions

Тревога

  • 36 alert event types delivered by Email, Telegram or Slack

Every feature runs locally with no license key. Optionally, the WordSec service at wordsec.net supplies threat-intelligence data that cannot be produced locally: managed WAF rule sets, the malware signature feed, IP-reputation lists, the GeoIP database and vulnerability records. Connecting is optional and every external service is documented in «External services» below.

Внешние сервисы

WordSec спроектирован для локальной работы, и без лицензионного ключа он не отправляет исходящих запросов к сервису WordSec. Основная фильтрация запросов и сканирование файлов выполняются на вашем сервере. К перечисленным ниже сервисам обращение происходит только для описанных конкретных функций, и к большинству из них только когда вы явно включаете соответствующую функцию (или, в случае WordSec API, только после активации лицензионного ключа). В этом разделе документируется каждый сторонний сервис, к которому может подключаться плагин, и данные, которые получает каждый из них.

WordSec API (api.wordsec.net)

WordSec работает бесплатно без лицензии, и в этом случае он вообще не обращается к этому сервису. Бесплатная лицензия доступна каждому; после активации ключа плагин связывается с сервисом WordSec для двух отдельных целей:

  1. Обязательные обращения к сервису (только пока активен лицензионный ключ): активация и проверка лицензии, а также обновления данных об угрозах (правила файрвола, сигнатуры вредоносного ПО, списки репутации IP, данные GeoIP, список доменов одноразовой электронной почты и данные об известных уязвимостях). Они обеспечивают работу облачных функций и не могут выполняться локально; без ключа ни одно из этих обращений не выполняется. Локальный код применения для этих функций (движок WAF, сканер вредоносного ПО, фильтры блокировки IP и фильтр ограничения регистрации) всегда присутствует и активен; без актуальной ленты у него просто нет данных threat-intelligence, с которыми можно сверять запросы.

* Когда: при активации/проверке и при плановых проверках обновлений данных об угрозах.
* Отправляемые данные: URL вашего сайта и лицензионный ключ (используются для вашей аутентификации и привязки лицензии к этому сайту), а для проверок обновлений: текущие версии установленных вами лент данных об угрозах.

  1. Дополнительная телеметрия использования/окружения (ПО ЖЕЛАНИЮ, ПО УМОЛЧАНИЮ ОТКЛЮЧЕНА): анонимный ежедневный снимок, используемый для улучшения WordSec. Он отправляется только после того, как вы явно включите «Share usage & environment data» (при активации лицензии или в Настройки Advanced Usage Data), и его можно снова отключить в любой момент.

* Когда: один раз в день, только пока включена опция.
* Отправляемые данные: обезличенный снимок окружения сайта (версии сервера, WordPress, PHP и базы данных, список активных плагинов и тем) и агрегированная статистика использования функций и безопасности WordSec. Пароли, учётные данные базы данных, секретные ключи или адреса электронной почты никогда не отправляются.

  • Условия обслуживания: https://wordsec.net/terms
  • Политика конфиденциальности: https://wordsec.net/privacy

Have I Been Pwned (api.pwnedpasswords.com)

Используется дополнительной проверкой утечки паролей для обнаружения того, встречается ли пароль в известных утечках данных, с использованием k-anonymity.
* Когда: когда пользователь задаёт или отправляет пароль и включена проверка утечки паролей.
* Отправляемые данные: только первые 5 символов SHA-1 хеша пароля. Сам пароль и его полный хеш никогда не покидают ваш сайт.
* Условия и конфиденциальность: https://haveibeenpwned.com/Privacy

WordPress.org API (api.wordpress.org, downloads.wordpress.org, wordpress.org, core.svn.wordpress.org, plugins.svn.wordpress.org, themes.svn.wordpress.org)

Используется для проверки целостности файлов ядра WordPress, плагинов и тем, для получения публичной информации о плагинах/темах (plugins_api/themes_api) для оценок репутации цепочки поставок и проверок целостности обновлений, для загрузки собственного языкового пакета WordSec с translate.wordpress.org, когда вы выбираете язык интерфейса, который ещё не установлен (тот же механизм, который использует сам WordPress при смене языка сайта), и — только когда вы нажимаете «Repair» на находке сканера — для загрузки оригинальной копии изменённого файла ядра/плагина/темы, чтобы его можно было восстановить. Загрузки для восстановления получают отдельные оригинальные файлы с plugins.svn.wordpress.org / themes.svn.wordpress.org / core.svn.wordpress.org, с откатом к полным пакетам с downloads.wordpress.org (zip-архивы плагинов/тем) и wordpress.org (zip-архивы релизов ядра).
* Когда: во время сканирований на вредоносное ПО/целостность и проверок репутации цепочки поставок, при явном действии восстановления и при сохранении языка интерфейса, перевод которого ещё не установлен.
* Отправляемые данные: версия ядра WordPress, локаль сайта и слаги/версии проверяемых плагинов/тем; при загрузке языка — слаг/версия плагина и выбранная локаль.
* Условия и конфиденциальность: https://wordpress.org/about/privacy/

RDAP (rdap.org)

Используется инструментом поиска WHOIS/RDAP на странице Инструменты для отображения информации о владельце IP-адреса или домена, который вы проверяете.
* Когда: только когда вы запускаете инструмент поиска WHOIS/RDAP.
* Отправляемые данные: IP-адрес или домен, который вы выбрали для поиска.
* Условия и конфиденциальность: https://about.rdap.org/

ipify (api.ipify.org)

Используется инструментом проверки чёрных списков на странице Инструменты и инструментом информации о сервере для определения собственного публичного IP-адреса вашего сервера.
* Когда: только когда вы запускаете инструмент «Blacklist Check» или «Server IPs».
* Отправляемые данные: обычный запрос с вашего сервера; данные сайта не включаются (сервис просто возвращает запрашивающий IP).
* Условия и конфиденциальность: https://www.ipify.org/

Провайдеры списков блокировки DNS (инструмент Blacklist Check)

Инструмент «Blacklist Check» на странице Инструменты отправляет запросы к спискам блокировки на основе DNS (DNSBL), чтобы сообщить, внесён ли публичный IPv4-адрес вашего сервера в списки. Каждый провайдер получает стандартный DNS-запрос, содержащий IP-адрес вашего сервера в обратном порядке. Опрашиваются пять провайдеров:
* Spamhaus ZEN (zen.spamhaus.org): https://www.spamhaus.org/privacy-notice/
* SpamCop (bl.spamcop.net), управляется Cisco: https://www.cisco.com/c/en/us/about/legal/privacy-full.html
* Barracuda Reputation Block List (b.barracudacentral.org): https://www.barracuda.com/company/legal/privacy-policy
* UCEPROTECT Level 1 (dnsbl-1.uceprotect.net): https://www.uceprotect.net/en/index.php
* PSBL (psbl.surriel.com): https://psbl.org/
Подробности:
* Когда: только когда вы нажимаете «Blacklist Check» на странице Инструменты.
* Отправляемые данные: публичный IPv4-адрес вашего сервера, встроенный в каждый DNS-запрос к спискам блокировки.

Telegram Bot API (api.telegram.org)

Дополнительный канал доставки оповещений. Активен только когда вы настраиваете собственный токен бота Telegram и ID чата.
* Когда: когда срабатывает включённое вами оповещение безопасности и настроена доставка через Telegram.
* Отправляемые данные: текст сообщения оповещения (тип события, название сайта, соответствующий контекст IP/пользователя) на настроенный вами бот/чат.
* Условия обслуживания: https://telegram.org/tos
* Политика конфиденциальности: https://telegram.org/privacy

Входящие вебхуки Slack (hooks.slack.com)

Дополнительный канал доставки оповещений. Активен только когда вы настраиваете собственный URL входящего вебхука Slack.
* Когда: когда срабатывает включённое вами оповещение безопасности и настроена доставка через Slack.
* Отправляемые данные: текст сообщения оповещения (тип события, название сайта, соответствующий контекст IP/пользователя) на настроенный вами вебхук.
* Условия обслуживания: https://slack.com/terms-of-service
* Политика конфиденциальности: https://slack.com/privacy-policy

Google reCAPTCHA (www.google.com, www.gstatic.com)

Дополнительная CAPTCHA для входа/регистрации. Активна только когда вы выбираете reCAPTCHA и указываете свои собственные ключи.
* Когда: на формах входа и регистрации, пока функция включена.
* Загружается удалённо: reCAPTCHA требует, чтобы его скрипт виджета (www.google.com/recaptcha/api.js, поставляемый с ресурсами с www.gstatic.com) загружался из Google в браузере посетителя; он подключается только на этих формах и только пока reCAPTCHA выбран в качестве провайдера. Проверка токена выполняется серверным запросом с вашего сайта к www.google.com.
* Отправляемые данные: токен ответа CAPTCHA, ваш публичный ключ сайта и IP-адрес посетителя.
* Условия обслуживания: https://policies.google.com/terms
* Политика конфиденциальности: https://policies.google.com/privacy

hCaptcha (hcaptcha.com, js.hcaptcha.com)

Дополнительная CAPTCHA для входа/регистрации. Активна только когда вы выбираете hCaptcha и указываете свои собственные ключи.
* Когда: на формах входа и регистрации, пока функция включена.
* Загружается удалённо: hCaptcha требует, чтобы его скрипт виджета (js.hcaptcha.com/1/api.js) загружался из hCaptcha в браузере посетителя; он подключается только на этих формах и только пока hCaptcha выбран в качестве провайдера. Проверка токена выполняется серверным запросом с вашего сайта к hcaptcha.com.
* Отправляемые данные: токен ответа CAPTCHA, ваш публичный ключ сайта и IP-адрес посетителя.
* Условия обслуживания: https://www.hcaptcha.com/terms
* Политика конфиденциальности: https://www.hcaptcha.com/privacy

Cloudflare Turnstile (challenges.cloudflare.com)

Дополнительная CAPTCHA для входа/регистрации. Активна только когда вы выбираете Turnstile и указываете свои собственные ключи.
* Когда: на формах входа и регистрации, пока функция включена.
* Загружается удалённо: Turnstile требует, чтобы его скрипт виджета (challenges.cloudflare.com/turnstile/v0/api.js) загружался из Cloudflare в браузере посетителя; он подключается только на этих формах и только пока Turnstile выбран в качестве провайдера. Проверка токена выполняется серверным запросом с вашего сайта к challenges.cloudflare.com.
* Отправляемые данные: токен ответа CAPTCHA, ваш публичный ключ сайта и IP-адрес посетителя.
* Условия обслуживания: https://www.cloudflare.com/website-terms/
* Политика конфиденциальности: https://www.cloudflare.com/privacypolicy/

ipwhois.io (ipwho.is)

Optional IP details service, disabled by default. All requests go over HTTPS with certificate verification, and none are made until you enable «External IP Lookup Service» in WordSec Settings (Visitor IP Handling section). It is used for exactly one thing: the «IP details» lookup in Live Traffic (country, region, city, ISP, organization, ASN). Traffic logging never contacts this service; country resolution during logging uses only the local GeoIP database.
* When: only while the External IP Lookup Service opt-in is enabled, and only on your click in the IP details lookup.
* Data sent: the IP address you chose to inspect.
* Terms of Service: https://ipwhois.io/terms
* Privacy Policy: https://ipwhois.io/privacy

VirusTotal (virustotal.com)

Не запрашивается автоматически. Сканер показывает ссылку «Check on VirusTotal», которую можно нажать, чтобы открыть VirusTotal в браузере для конкретного файла.
* Когда: только когда вы нажимаете ссылку.
* Отправляемые данные: хеш файла, содержащийся в URL ссылки.
* Условия и конфиденциальность: https://docs.virustotal.com/docs/privacy-policy

Qualys SSL Labs (ssllabs.com)

Не запрашивается автоматически. Тест «Check SSL Health» на странице Инструменты выполняется полностью на вашем собственном сервере (он открывает TLS-соединение с вашим доменом и считывает сертификат). Рядом с ним ссылка «Deep Scan (SSL Labs)» открывает тест Qualys SSL Labs в новой вкладке браузера; затем SSL Labs подключается к вашему сайту снаружи и оценивает его конфигурацию TLS. Ссылка содержит флаг «hide results», поэтому отчёт не публикуется на публичной доске SSL Labs.
* Когда: только когда вы нажимаете ссылку «Deep Scan (SSL Labs)».
* Отправляемые данные: доменное имя вашего сайта, содержащееся в URL ссылки.
* Условия: https://www.ssllabs.com/about/terms.html
* Конфиденциальность: https://www.qualys.com/company/privacy/

Благодарности

WordSec включает перечисленные ниже сторонние библиотеки. Каждая библиотека распространяется под лицензией, совместимой с собственной лицензией WordSec «GPLv2 or later». Каждая включённая библиотека сохраняет свой внутрифайловый лицензионный баннер и/или свой исходный файл лицензии, а полный оригинальный (не минифицированный) исходный код каждой из них доступен по ссылке на соответствующий проект и версию.

Библиотеки PHP (`vendor/`)

TCPDF 6.11.3
* Лицензия: LGPL-3.0-or-later
* Авторские права: Nicola Asuni, Tecnick.com LTD
* Источник: https://github.com/tecnickcom/TCPDF
* Файл лицензии: vendor/tecnickcom/tcpdf/LICENSE.TXT
* Используется для: генерации отчётов и экспорта в PDF

SimpleXLSXGen 1.5.x
* Лицензия: MIT
* Авторские права: (c) 2020-2022 Sergey Shuchkin
* Источник: https://github.com/shuchkin/simplexlsxgen
* Файл лицензии: vendor/shuchkin/simplexlsxgen/LICENSE
* Используется для: экспорта в XLSX (Excel)

Библиотеки JavaScript / CSS (`assets/*/vendor/`)

Select2 4.1.0-rc.0
* Лицензия: MIT
* Авторские права: Kevin Brown, Igor Vaynberg и участники Select2
* Источник: https://github.com/select2/select2
* Текст лицензии: https://github.com/select2/select2/blob/master/LICENSE.md
* Включённые файлы: assets/js/vendor/select2.min.js, assets/css/vendor/select2.min.css

ApexCharts 5.16.0
* Лицензия: MIT
* Авторские права: (c) 2018-2026 ApexCharts
* Источник: https://github.com/apexcharts/apexcharts.js
* Текст лицензии: https://github.com/apexcharts/apexcharts.js/blob/main/LICENSE
* Включённые файлы: assets/js/vendor/apexcharts.min.js

jsVectorMap 1.7.0
* Лицензия: MIT
* Авторские права: (c) Mustafa Omar и участники jsVectorMap
* Источник: https://github.com/themustafaomar/jsvectormap
* Текст лицензии: https://github.com/themustafaomar/jsvectormap/blob/master/LICENSE
* Включённые файлы: assets/js/vendor/jsvectormap.min.js, assets/css/vendor/jsvectormap.min.css
* Используется для: визуализаций карты мира (Живой трафик / Блокировка / Файрвол)

Данные карты мира (world_mill), зарегистрированные как карта «world» в jsVectorMap
* Лицензия: MIT
* Авторские права: участники jvectormap-content; геометрия карты получена из Natural Earth (public domain)
* Источник: https://www.npmjs.com/package/jvectormap-content
* Включённые файлы: assets/js/vendor/world.js
* Используется для: геометрии стран, отображаемой в визуализациях карты мира выше

qrcode-generator 1.4.4
* Лицензия: MIT
* Авторские права: Kazuhiko Arase
* Источник: https://github.com/kazuhikoarase/qrcode-generator
* Текст лицензии: https://github.com/kazuhikoarase/qrcode-generator/blob/master/LICENSE
* Включённые файлы: assets/js/vendor/qrcode.min.js

Иконки / ресурсы

flag-icons (SVG-флаги стран)
* Лицензия: MIT (SVG-разметка); сами дизайны флагов находятся в public domain
* Авторские права: (c) 2013 Panayiotis Lipiridis
* Источник: https://github.com/lipis/flag-icons
* Текст лицензии: https://github.com/lipis/flag-icons/blob/main/LICENSE
* Включённые файлы: assets/images/flags/*.svg (флаги стран, 4×3 viewBox="0 0 640 480")

Скриншоты

Установка

  1. Загрузите файлы плагина в /wp-content/plugins/wordsec/ или установите его через экран Плагины в WordPress.
  2. Активируйте плагин через экран Плагины в WordPress.
  3. Откройте меню WordSec, чтобы начать настройку.

При активации создаются только таблицы базы данных плагина, настройки по умолчанию и его собственный каталог данных. WordSec никогда не изменяет .htaccess, .user.ini или wp-config.php, не меняет права доступа к файлам и не устанавливает пред-WordPress загрузчик WAF без явного, чётко обозначенного действия с вашей стороны, а при деактивации все такие изменения отменяются.

Часто задаваемые вопросы

Замедляет ли WordSec мой сайт?

Нет. WordSec построен на минимальном количестве запросов к базе данных, пакетной обработке и интеллектуальном кэшировании, поэтому защита не достигается ценой производительности.

Нужен ли лицензионный ключ для использования WordSec?

Нет. WordSec устанавливается и работает как полностью функциональный бесплатный плагин с локальной защитой: файрвол веб-приложений (ваши собственные пользовательские правила плюс встроенные предустановленные правила), защита от brute-force и защита входа, двухфакторная аутентификация, усиление безопасности, настройка геоблокировки, журнал аудита и многое другое работают без какого-либо ключа.

Требуется ли какой-либо внешний сервис?

Нет, для работы не требуется. Основная защита WordSec выполняется локально на вашем сервере, и без лицензионного ключа плагин вообще не обращается ни к каким внешним сервисам WordSec.

Can WordSec help with malware removal on a hacked site?

Yes. The security scanner examines your files, the database and scheduled tasks, and every finding can be quarantined with one click. A modified WordPress core, plugin or theme file can also be repaired straight from its original copy on WordPress.org, and the scan history keeps a record of everything that was found and changed.

Does WordSec include brute force protection?

Yes. Failed logins are rate limited with progressive lockout, so each further attempt from the same source waits longer. You can also add a honeypot field, rename the login URL, require a CAPTCHA on the login form, and restrict logins by IP, country or time of day.

Does WordSec support two factor authentication?

Yes. Two factor authentication uses RFC 6238 TOTP codes from any standard authenticator app, and you choose which roles have to use it. For the case where a device is lost and nobody can get in, a WORDSEC_DISABLE_2FA constant in wp-config.php provides emergency access.

What does the web application firewall actually block?

The built-in rule sets cover SQL injection, cross-site scripting, path traversal, and PHP and command injection. You can add your own rules with a multi-condition builder, run the firewall in learning mode before you enforce anything, and optionally enable Extended Protection so requests are inspected before WordPress loads.

Can I run WordSec next to another security plugin?

You can, but it is not recommended. Two firewalls inspecting the same request, or two scanners walking the same files, cost you performance and produce duplicate alerts. WordSec is built to own site security end to end, so the usual path is to deactivate the others first.

Каковы минимальные требования?

WordPress 6.9+, PHP 7.4+ и MySQL 5.6+ / MariaDB 10.1+.

Отзывы

26.07.2026
I’ve been using Wordfence, and it has been one of the most reliable security plugins for my WordPress sites. Easy to set up, excellent protection, and regular updates. Highly recommended! Thank you…
23.07.2026
I’ve tried several WordPress security plugins over the years, but WordSec has honestly been one of the best experiences so far. After the recent wp2shell vulnerability was disclosed, I tested my website with and without WordSec installed. During my testing, anonymous REST API access was blocked, preventing my site from being exposed to the same attack surface. I still updated WordPress immediately, but it was reassuring to see WordSec providing an additional layer of protection against emerging threats. Beyond that, I really like the overall feature set. Protection against SQL injection, remote code execution attempts, brute force attacks, malicious file uploads, and XML-RPC abuse gives me confidence that my sites are well protected. The firewall rules work out of the box, and I didn’t have to spend hours configuring everything. Another big advantage is performance. Unlike some security plugins that noticeably slow down WordPress, WordSec is lightweight and has had virtually no impact on my site’s speed. If you’re looking for a modern, lightweight, and reliable WordPress security plugin that focuses on practical protection instead of unnecessary complexity, I highly recommend WordSec. Great work by the developer. Looking forward to future updates!
Посмотреть все 2 отзыва

Участники и разработчики

«WordSec – Malware Scanner & Removal, Web Application Firewall (WAF), and 2FA» — проект с открытым исходным кодом. В развитие плагина внесли свой вклад следующие участники:

Участники

«WordSec – Malware Scanner & Removal, Web Application Firewall (WAF), and 2FA» переведён на 6 языков. Благодарим переводчиков за их работу.

Перевести «WordSec – Malware Scanner & Removal, Web Application Firewall (WAF), and 2FA» на ваш язык.

Заинтересованы в разработке?

Посмотрите код, проверьте SVN репозиторий, или подпишитесь на журнал разработки по RSS.

Журнал изменений

1.1.0

  • Fixed: Uninstalling the plugin with a data-removal option and later reinstalling it could permanently lock two-factor authentication users out of the login, because the stored 2FA secrets survived the uninstall while their encryption key did not. Uninstall now removes the plugin’s per-user data together with the key, and the «keep only the license key» option preserves the key material the stored license needs.
  • Fixed: Uninstall left cached entries and the GeoIP/quarantine folders behind; everything under uploads/wordsec is now removed unless «keep everything» is selected.

1.0.10

  • Changed: The optional ipwhois.io service is now contacted only when you open the «IP details» window in Live Traffic. Traffic logging never calls it anymore, so background visits can no longer spend the monthly lookup quota and leave the IP details window reporting «Rate limit exceeded».
  • Changed: The Live Traffic log no longer stores a per-request city, and the unused city database column is removed. City is still shown in the IP details window.
  • Fixed: The Blocked IP Address table loaded 25 rows after a page refresh even though 10 per page was selected. The rows-per-page choice, sorting and current page are now remembered like the other log tables, and the Clear button returns the time range to All.
  • Fixed: Sorting the Alarm Log or Firewall Log table could flip the column arrow to the opposite of the order actually applied.

1.0.9

  • Fixed: On sites where WordPress is installed in a subdirectory, Login URL Rename left no way in: the custom login address returned a 404 while wp-login.php and wp-admin stayed blocked. The custom address now works, and so do the /login, /admin and /dashboard shortcuts.
  • Fixed: «Block Sensitive Files Access» blocked legitimate media library downloads (.zip, .sql, .log and similar) on subdirectory installations, because the exception for the uploads folder did not match. The exception now follows the real uploads location.
  • Fixed: The Blackhole trap never triggered on subdirectory installations, and a request carrying a query string slipped past it everywhere.
  • Fixed: The login IP and country whitelist did not cover a renamed login page on subdirectory installations.
  • Fixed: Plugin and theme enumeration blocking did not run on subdirectory installations when the request reached PHP.
  • Fixed: The Nginx and IIS rule examples shown for servers that ignore .htaccess now include the installation path, so they match on subdirectory installations.
  • Fixed: An invalid custom login slug was silently replaced instead of reported, and on a site that had no slug yet it could become a predictable default. The value is now rejected with a message and the previous slug is kept.
  • Fixed: When a stored two-factor secret could no longer be decrypted (for example after a security key rotation), login was refused even with the correct password and turning two-factor authentication off did not help. The 2FA toggle now fully disables the check, and a WORDSEC_DISABLE_2FA constant in wp-config.php provides emergency access.
  • Fixed: «Hide Login Errors» no longer replaces two-factor and site-state error messages with the generic «credentials incorrect» text; only credential errors are masked.
  • Improved: Two-factor secrets stored in older encryption formats are now re-encrypted to the current format in the background, so a future security key rotation can no longer invalidate them.

1.0.8

  • Fixed: File Permission Hardening could make a site unreachable. It set the root .htaccess to mode 0440, which takes away read access for the web server on hosting panels where the web server runs as a different user than the file owner (Plesk, cPanel and similar). Apache then answered every request with 403 and logged «AH00529 pcfg_openfile: unable to check htaccess file». The root .htaccess is now set to 0644 so the web server can always read it, while wp-config.php still becomes read-only at 0440. Affected sites are repaired automatically the next time an admin page is opened with the option enabled.
  • Fixed: The malware scanner recommended the same 0440 mode for the root .htaccess, so Fix All (and scheduled scans with automatic fixing) could re-apply it. The scanner now expects 0644 and reports a .htaccess the web server cannot read as an issue instead.
  • Fixed: The Tools file permission check listed 0440 as the recommended mode for .htaccess and now recommends 0644.
  • Fixed: The security score no longer expects the .htaccess file to be unreadable by the web server; only group or world write access counts against the score.

1.0.7

  • Fixed: «Prevent User Enumeration» no longer blocks ordinary author pages. Only ID-based probes (such as /?author=1, which WordPress resolves into a username) are blocked; a visitor opening a known author archive like /author/name/ is served normally. The REST users endpoint and the users sitemap stay closed as before.
  • Fixed: The scanner’s «View matched content» dialog showed its content box in white while dark mode was active.
  • Improved: The block page shown to blocked visitors carries the WordSec wordmark with a «WordPress Security Plugin» line beneath it.
  • Improved: The block screen rendered by Extended Protection (the pre-WordPress firewall) is now identical to the one WordPress serves, instead of a near-copy with an extra error code and reference line.
  • Fixed: Uninstalling with «keep only the license key» now also keeps this site’s identifier, so reinstalling reuses the existing license binding instead of registering the site a second time.

1.0.6

  • Новое: сканер теперь сообщает о неожиданных лишних файлах в папках плагинов и тем, размещённых на WordPress.org (файлы, не входящие в официальный выпуск). Такие файлы — распространённое место для скрытия подброшенных вредоносных нагрузок, не соответствующих ни одной сигнатуре. Находки поддерживают карантин и охватываются функцией «Исправить всё».
  • Улучшено: восстановление файлов плагинов и тем теперь получает отдельный оригинальный файл напрямую из SVN WordPress.org (тот же канал, который уже используется для восстановления ядра) вместо загрузки и распаковки всего zip-архива плагина/темы; zip-пакет остаётся автоматическим запасным вариантом.
  • Исправлено: восстановление плагинов и тем могло сообщать «возможно, плагин не размещён на WordPress.org» для плагинов, которые там размещены, поскольку шаг распаковки zip выполнялся без инициализированной файловой системы WordPress.
  • Исправлено: темы по умолчанию, поставляемые с WordPress (например, Twenty Twenty-Five), больше не вызывают ложных находок «Изменённый файл темы». WordPress поставляет собственные сборки этих тем, которые могут побайтно отличаться от выпуска той же версии в каталоге тем; файлы, соответствующие официальным контрольным суммам ядра, теперь распознаются как подлинные.
  • Улучшено: таблица «История сканирований» показывает полную разбивку по серьёзности (всего, критическая, высокая, средняя, низкая, информационная) при наведении на столбец «Найдено проблем».

1.0.5

  • Исправлено: сканер вредоносного ПО больше не помечает собственные неизменённые файлы WordSec. Файлы, побайтно совпадающие с официальными контрольными суммами выпуска WordPress.org для установленной версии WordSec, исключаются из сопоставления с сигнатурами; изменённый или неизвестный файл по-прежнему не проходит проверку контрольной суммы и сканируется обычным образом.

1.0.4

  • Новое: мастер настройки. Первая активация теперь открывает пошаговую управляемую настройку: выберите Рекомендуемую, Стандартную или полностью Пользовательскую конфигурацию для firewall, безопасности входа, блокировки и настроек, настройте CAPTCHA, двухфакторную аутентификацию, переименование URL входа и каналы доставки тревог и завершите шагом лицензии. Каждое изменение, касающееся передачи данных или файлов сервера, раскрывается до его применения, а мастер можно перезапустить в любое время из Настроек.
  • Новое: выбор того, что произойдёт с вашими данными при удалении (сохранить всё, сохранить только лицензионный ключ или удалить всё), теперь предлагается в диалоге при деактивации плагина, в дополнение к существующему элементу управления в Настройках.
  • Улучшено: обнаружение и производительность сканера вредоносного ПО.
  • Улучшено: визуальные доработки по всему интерфейсу администратора.
  • Исправлено: известные проблемы, о которых сообщалось после выхода 1.0.3.

1.0.3

  • WordPress 6.9 теперь минимальная поддерживаемая версия.
  • Пред-WordPress загрузчик WAF («Расширенная защита») больше не устанавливается при активации. Это явно подключаемая опция на странице Файрвол, которая перечисляет каждое вносимое ею изменение на сервере, и её отключение (или деактивация плагина) отменяет их все.
  • Функции усиления безопасности, которые записывают в .htaccess, .user.ini или wp-config.php, меняют права доступа к файлам или удаляют файлы, теперь по умолчанию отключены, и описание каждого переключателя точно указывает, что он записывает.
  • Деактивация теперь восстанавливает исходные отладочные константы wp-config.php и исходные права доступа к файлам, а также удаляет все файлы и директивы, добавленные плагином; удаление повторно выполняет эту очистку в качестве подстраховки.
  • Резервная IP-геолокация и поиск сведений об IP в Живом трафике переключены с ip-api.com на ipwhois.io, всегда по HTTPS с проверкой сертификата, и каждый запрос теперь ограничен новой отключённой по умолчанию опцией «External IP Lookup Service» (Настройки Visitor IP Handling).
  • Оценки репутации цепочки поставок теперь полностью работают без лицензионного ключа: публичные данные о плагинах/темах wordpress.org загружаются напрямую, когда зеркало сервиса недоступно.
  • Диалог сведений об IP в Живом трафике показывает локальную статистику запросов (итоги, количество блокировок, уровень угрозы), даже когда внешние поиски отключены.
  • Страница Настройки реорганизована: Usage Data перемещён наверх, параметры языка и интерфейса объединены в одну карточку Admin Interface, а раздел Visitor IP переименован в Visitor IP Handling.
  • Описания на странице Инструменты теперь называют внешние сервисы, к которым обращается каждый инструмент (api.ipify.org, rdap.org и провайдеры списков блокировки DNS).
  • Расширена документация по внешним сервисам: теперь перечислены провайдеры списков блокировки DNS, все хосты загрузки wordpress.org и сервис ipwhois.io.
  • Исправлены некоторые известные ошибки.
  • Внесены визуальные улучшения.

1.0.2

  • Все функции теперь полностью работают локально без лицензионных ограничений.
  • Исправлена ошибка в сканере вредоносного ПО.
  • Данные времени выполнения (правила WAF, списки блокировки, GeoIP, карантин) теперь размещаются в папке uploads (uploads/wordsec).
  • Дополнительные исправления расположения файлов/каталогов и соответствия рекомендациям wp.org.

1.0.1

  • Встроенные скрипты/стили перенесены в API постановки в очередь WordPress.
  • Усилена очистка входных данных при обработке запросов.
  • Обновлены включённые библиотеки: ApexCharts 5.16.0, TCPDF 6.11.3.
  • База данных GeoIP теперь хранится в wp-content/wordsec-data/ вместо папки плагина.
  • Расширена документация по внешним сервисам в этом readme.

1.0.0

  • Первый публичный релиз.