G|Translate: English EN Deutsch DE Italiano IT Русский RU Español ES Українська UK

Прячем информационные файлы WordPress

После установки WordPress в папке сайта создаются несколько информационных файлов

Прячем информационные файлы WordPress

Это собственно файлы:

  • license.txt
  • readme.html

Их можно просмотреть через прямой доступ в строке URL. Ранее в файлах добрый WP указывал установленную версию, чем облегчал работу хакеров. Теперь убрали, но нельзя гарантировать, что в будущих обновлениях снова не добавят.

Поэтому лучше закрыть.

Совет “Удалить после установки!” не подходит – т.к. при обновлении эти файлы будут восстановлены.

Файл license.txt

Описание лицензии GPL и указание на CMS WP 

Прячем информационные файлы WordPress

Файл readme.html

Общее описание WordPress

Прячем информационные файлы WordPress

Файл wp-config-sample.php

Это, собственно, не информационный файл. Это образец для создания файла wp-config.php уже с данными базы данных и ключами (в процессе установки).

Прячем информационные файлы WordPress 

Тем не менее – желающих его открыть много. Что они хотят получить в итоге – непонятно. Но сервер бессмысленную работу делает.

Надо тоже его закрыть от любопытных.

Закрываем доступ через инструкции .htaccess для Apache

C учетом возможных двух версий Apahce (ver 1 и ver 2) у хостеров (наличие/отсутствие модуля mod_authz_core.c) делаем следующий вариант

# block license.txt --------------------------------------
<Files license.txt>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</Files>
# block readme.html --------------------------------------
<Files readme.html>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</Files>
# block wp-config* ----------------------------------------
<Files "wp-config*">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</Files>

Если модуль mod_authz_core.c есть – то Require all denied

Если модуля mod_authz_core.c нет – по старому варианту через Deny from all

Для wp-config делаем имя со звездочкой, это закроет файлы от внешнего доступа:

  • wp-config-sample.php
  • wp-config.php

Результат

Прячем информационные файлы WordPress

Доступ запрещен, ошибка 403.  Хорошо.

WordPress 5.6 – результаты поиска на сайте стали попадать в индекс

В версии WP 5.6 страница с результатами поиска изменилась и стала попадать в индекс поисковых машин

WordPress 5.6 - результаты поиска на сайте стали попадать в индекс

Что это такое? 

А это теперь WordPress оптимизировал URL выдачи результатов внутреннего поиска в виде domen.ru/search/term

Ранее было domen.ru/? s = term

И побежали радостные китайские боты заводить в поиск всякую чепуху.

Если в этот момент на страницу заходит поисковый  робот:

  • он её проверяет
  • получает ответ от сервера 200 ОК  (даже при отрицательных результатах поиска!)
  • ой
  • и радостно сохраняет в индексе

Вот так это выглядит в строке URL

WordPress 5.6 - результаты поиска на сайте стали попадать в индекс 

Для запрета поисковым роботам индексации необходимо добавить в файл robots.txt инструкцию

Disallow: /search

Это запрет на индекс папки и её содержимого.

Подробнее читаем в статье

Файл robots.txt

UPD

В обновлении WordPress 5.6.1 исправили – теперь страница поиска закрыта тэгом ‘noindex’ и код 200 не возвращается.

WordPress 5.6 - результаты поиска на сайте стали попадать в индекс

И хорошо.

А то тупые китайские боты могли наделать кучу бессмысленных страниц в индексе….

В WP 5.6 добавлена базовая авторизация HTTP

Можно увидеть в файле .htaccess новую строку

В WP 5.6 добавлена базовая авторизация HTTP

Это добавлена возможность создавать пароли приложений:

  • на сайте должно быть включено шифрование SSL (протокол HTTPS)
  • для API WP
  • для защиты мобильного входа в админку xml-rpc.php (через сервер WordPress)

Подробнее можно прочитать в статье 

Пароли приложений (авторизация)

Сделано на основе плагина Application Passwords

Пароли можно установить в управлении учетной записью пользователя

В WP 5.6 добавлена базовая авторизация HTTP

Смысл в том, что Вы указываете мобильное приложение на своем смартфоне (которое, например, WordPress), создаете для него пароль = и Вы можете входить в мобильную версию админки (только с данного устройства) без основного пароля пользователя. 

Фактически Вы привязываете свое мобильное устройство к мобильной административной панели своего сайта.

Пароли приложения также можно установить по дополнительной ссылке в панели управления

domen.ru/wp-admin/authorize-application.php

В WP 5.6 добавлена базовая авторизация HTTP

Если у Вас включена базовая авторизация административной панели wp-login.php – то почему-то не работает…

Или такой вариант сделан

Двухфакторная аутентификация WordPress

Выдает предупреждение: Ваш сайт, похоже, использует базовую HTTP авторизацию, которая в настоящее время несовместима с паролями приложений

В WP 5.6 добавлена базовая авторизация HTTP

Т.е. можно пока или основной вход или мобильный вход в админку защитить дополнительной авторизацией. Странно.

Наверное, в WP 5.7 исправят.

Плагин Duplicator опасно сохраняет архив

Наш любимый плагин Duplicator для архивирования сайта

Плагин Duplicator опасно сохраняет архив

Основная статья тут

Плагины для архивирования и переноса сайта

Запускаем создание пакета (версия плагина 1.3.37)

Плагин Duplicator опасно сохраняет архив

Готово. Смотрим, а что там на сервере?

А в папке на сервере есть копия файла wp-config.txt (тестовая версия wp-config.php). 

Плагин Duplicator опасно сохраняет архив

А попробуем её открыть по URL (mysite.ru/wp-snapshots/name_wp-config.txt).

Упс. Всё прекрасно открывается.

Часть параметром базы из копии убрана – но всё равно, опасная игра. Полное название файла можно легко восстановить, зная как плагин его формирует.

Плагин Duplicator опасно сохраняет архив

И прочитав параметры из этого файла – нехороший человек легко получит доступ к Вашему сайту. Поосторожнее с обновлениями.

Всегда проверяйте, что там плагины в реальности делают…

UPD.

В версии 1.3.40 уже исправили, больше нет копии wp-config.php в отдельном файле (и соответственно с прямым URL).

Вышла новая версия плагина (widget) вывода списка авторов 1.2

В новой версии плагина

Вышла новая версия плагина (widget) вывода списка авторов  1.2

добавлена возможность управлением показа e-mail автора.

Сам плагин можно скачать здесь

Плагин вывода списка авторов блога (виджет)

В настройках – по умолчанию показ включён

Вышла новая версия плагина (widget) вывода списка авторов  1.2

Без почты автора строки с e-mail в выводе не будет

Вышла новая версия плагина (widget) вывода списка авторов  1.2

Пользуйтесь на здоровье :)

Делаем модальное окно iFrame с помощью jQuery для WordPress

Красивое модальное окно вот такого плана для открытия в нем ссылки

Делаем модальное окно iFrame с помощью jQuery для WordPress

Посмотреть в живую можно вот тут

Несмотря на то, что это достаточно популярный запрос “как сделать открыть ссылку в модальном окне” – на первых пяти страницах выдачи (как Яндекс, так и Гугль) сплошной мусор… С вариантами ответов “использовать target=_blank”.

Базовый код не мой – но он немного модифицирован, что бы всё работало правильно.

Какие тут проблемы:

  • можно использовать совсем готовую библиотеку типа fancybox3 – только там кода (в приложенных библиотеках ) объемом почти на 100Кб
  • можно использовать чистый JS – но тут другие проблемы
    • для открытия ссылки нам нужен iFrame
    • при написании только на JS этот фрейм нужно заранее где-то создать – а именно в коде html (те просто у ссылки указать класс для обработки будет не достаточно)
    • jQuery умеет создавать код для вывода для браузера (совсем как php, только на локальной машине)
  • код на jQuery не всегда работает  в WordPress (есть такая загадка)

Итого готовый код модального окна IFrame (jQuery) для WordPress

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!----------------------------->
<style>
* {margin: 0; padding: 0}
.shadow {width: 100%; height: 100%; position: fixed; background-color: #444; top: 0; left:0; z-index: 400}
#modal {z-index: 500; position: fixed; background: #fff; top: 50px;}
#modal iframe {width: 100%; height: 100%}
#closeModal {position: absolute; top: -15px; right: -20px; font-size: 0.8em; }
#closeModal img {width: 30px; height: 30px;}
</style>
<!-- вот здесь должен быть вызов библиотеки jQuery при использовании в файле html вне WP-->
<!----------------------------->
<script type="text/javascript">
var shadow, modalX, modalY, modalWidth, modalHeight;
function modal(url) {
return '<div id="modal"><a id="closeModal" title="close" href="javascript:;"><img width="30" height="30" alt="close" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAANjr9RwUqgAAACBjSFJNAABtmAAAc44AAPJxAACDbAAAg7sAANTIAAAx7AAAGbyeiMU/AAAG7ElEQVR42mJkwA8YoZjBwcGB6fPnz4w/fvxg/PnzJ2N6ejoLFxcX47Rp036B5Dk4OP7z8vL+P3DgwD+o3v9QjBUABBALHguZoJhZXV2dVUNDgxNIcwEtZnn27Nl/ZmZmQRYWFmag5c90dHQY5OXl/z98+PDn1atXv79+/foPUN9fIP4HxRgOAAggRhyWMoOwqKgoq6GhIZe3t7eYrq6uHBDb8/Pz27Gysloga/jz588FYGicPn/+/OapU6deOnXq1GdgqPwCOuA31AF/0S0HCCB0xAQNBU4FBQWB0NBQublz59oADV37Hw28ePHi74MHD/6ii3/8+HEFMGQUgQ6WEhQU5AeZBTWTCdkigABC9ylIAZeMjIxQTEyMysaNG/3+/v37AGTgr1+//s2cOfOXm5vbN6Caz8jY1NT0a29v76/v37//g6q9sHfv3khjY2M5YAgJgsyEmg0PYYAAQreUk4+PT8jd3V1l1apVgUAzfoIM2rlz5x9gHH5BtxAdA9PB1zNnzvyB+R6oLxoopgC1nBPZcoAAgiFQnLIDMb+enp5iV1eXBzDeHoI0z58//xcwIX0mZCkMg9S2trb+hFk+ffr0QCkpKVmQ2VA7QHYxAgQQzLesQMwjIiIilZWVZfPu3bstMJ+SYikyBmUzkBnA9HEMyNcCYgmQHVC7mAACCJagOEBBbGdnp7lgwYJEkIavX7/+BcY1SvAaGRl9tba2xohjMTGxL8nJyT+AWQsuxsbG9vnp06e/QWYdPHiwHmiWKlBcCGQXyNcAAQSzmBuoSQqYim3u37+/EKR48uTJv5ANB+bVr7Dga2xs/AkTV1JS+gq0AJyoQIkPWU9aWtoPkPibN2/2A/l6QCwJ9TULQADB4hcY//xKXl5eHt++fbsAUmxhYYHiM1DiAsr9R7ZcVVUVbikIdHd3/0TWIyws/AWYVsByAgICdkAxRSAWAGI2gACClV7C4uLiOv7+/lEgRZ8+ffqLLd6ABck3ZMuB6uCWrlu37je29HDx4kVwQisvL88FFqkaQDERUHADBBAomBl5eHiYgQmLE1hSgQQZgIUD1lJm69atf4HR8R1YKoH5QIPAWWP9+vV/gOI/gHkeQw+wGAXTwAJJ5t+/f/BUDRBA4NIEKMDMyMjICtQIiniG379/4yza7t69+//Lly8oDrty5co/bJaCAEwcZCkwwTJDLWYCCCCwxcDgY3z16hXDnTt3voP4EhISWA0BFgZMwNqHExh3jMiG1tbWsgHjnA2bHmAeBtdWwOL1MycnJ7wAAQggBmi+kgIW/OaKiorJwOLuFShO0LMSMPF9AUYBSpz6+vqixHlOTs4P9MIEWHaDsxSwYMoE2mEGFJcG5SKAAGJCqjv/AbPUn8ePH98ACQQHB6NUmZqamkzABIgSp5s3bwbHORCA1QDLAWZkPc7OzszA8oHl5cuXVy5duvQBGIXwWgoggGA+FgO6xkBNTS28r69vDrT2+Y1cIMDyJchX6KkXVEmAshd6KB06dAic94EO3AzkBwGxPhCLg8ptgACCZyeQp9jZ2b2AmsuAefM8tnxJCk5ISPgOLTKfAdNEOVDMA2QHLDsBBBC8AAFlbmCLwlZISCg5JSVlJizeQAaQaimoWAUFK0g/sGGwHiiWCMS2yAUIQAAxI7c4gEmeFZi4OJ48ecLMzc39CRiEmgEBASxA/QzA8vYvAxEgNjaWZc2aNezAsprp2LFjp4FpZRdQ+AkQvwLij0AMSoC/AQIIXklAC3AVUBoBxmE8sPXQAiyvN8J8fuPGjR/h4eHf0eMdhkENhOPHj8OT+NGjR88BxZuBOA5kJtRseCUBEECMSI0AdmgBDooDaaDl8sASTSkyMlKzpqZGU1paGlS7MABLrX83b978A6zwwakTmE0YgIkSnHpBfGCV+gxYh98qKSk5CeTeAxVeQPwUiN8AMSjxgdLNX4AAYkRqCLBAXcMHtVwSaLkMMMHJAvOq9IQJE9R8fHxElJWV1bEF8aNHj+7t27fvLTDlXwXGLyhoH0OD+DnU0k/QYAa1QP8BBBAjWsuSFWo5LzRYxKFYAljqiAHzqxCwIBEwMTERBdZeoOYMA7Bl+RFYEbwB5oS3IA9D4/IFEL+E4nfQ6IDFLTgvAwQQI5ZmLRtSsINSuyA0uwlBUyQPMPWD20/AKo8ByP4DTJTfgRgUjB+gFoEc8R6amGDB+wu5mQsQQIxYmrdMUJ+zQTM6NzQEeKGO4UJqOzFADQMZ/A1qCSzBfQXi71ALfyM17sEAIIAY8fQiWKAYFgIwzIbWTv4HjbdfUAf8RPLhH1icojfoAQKIEU8bG9kRyF0aRiz6YP0k5C4LsmUY9TtAADEyEA+IVfufGEUAAQYABejinPr4dLEAAAAASUVORK5CYII="></a><iframe src="' + url + '"></iframe></div>';
}
shadow = "<div class='shadow'></div>";
jQuery(document).ready(function($) {
$(".myModal").on("click", function(e) {
e.preventDefault();
// get size and position
modalWidth = $(this).data("width");
modalHeight = $(this).data("height");
modalX = (($(window).innerWidth()) - modalWidth) / 2;
modalY = (($(window).innerHeight()) - modalHeight) / 2;
// append shadow layer
$(shadow).prependTo("body").css({
"opacity": 0.2
});
// append modal
$(modal(this.href)).appendTo("body").css({
"top": modalY,
"left": modalX,
"width": modalWidth,
"height": modalHeight
});
// close and remove
$("#closeModal").on("click", function() {
$("#modal, .shadow").remove();
});
$(document).keyup(function(event) {
if (event.keyCode === 27) {
$("#modal, .shadow").remove();
}
}); //keyup
}); // on
}); // ready
</script>
</head>
<!----------------------------->
<body>
<a href="https://wpavonis.ru/" class="myModal" data-width="800" data-height="600">open url</a>
</body>
<!----------------------------->
</html>

линия горизонтальной прокрутки появляется из-за вот этой длинной строки

<img width="30" height="30" alt="close" src="data:image/png;base64,iVBORw0KGgoAAAANSU...

пугаться не надо – это просто крестик в base64 для закрытия окна iFrame (что бы не грузить картинку с другого ресурса).

Что бы код заработал в виде отдельного файла html  – надо в начало <head> добавить вызов библиотеки jQuery

<script type="text/javascript" src="https://yastatic.net/jquery/2.1.3/jquery.min.js"></script>

например, вот так – с Яндекса.

Переходим к сути:

  •  в тэгах <style>…</style> находятся стили, которые отвечают за затемнение (паранджа) и внешний вид окна
  • в тэгах <script>…</script> находится наш код jQuery, который отвечает за вывод окна
  • и в html наша ссылка, в которой указан класс и размеры модального окна -> class=”myModal” data-width=”800″ data-height=”600″

 

Оригинальный код здесь https://jsfiddle.net/8b3Zj/

ВАЖНО – оригинальный код не будет работать в WP!

Основные различия

 Оригинальный кодКод для WordPress
крестик закрытия окнассылка на картинку PNG, квадратный крестикссылка на картинку в base64, круглый крестик
окно на экранедвигается при прокруткезафиксировано на экране
работа в WPне работаетработает

 

Почему код jQuery не работает в WordPress?

Что именно модифицированно в коде? 

В базовом коде в начале блока идет 

$(document).ready(function()

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

Поэтому в WordPress файл jquery.js, который располагается по адресу /wp-includes/js/jquery/jquery.js, отличается от стандартных версий библиотеки jQuery тем, что в конце файла прописана строчка:

jQuery.noConflict();

Эта строчка и отключает работу с элементами страницы через $.

Существует несколько вариантов решения:

  • использовать конструкцию вида jQuery(document).ready(function($) – как и сделано в измененном коде
  • заменить везде вызовы функций $ на jQuery – неудобно, когда код большой
  • использовать в начале скрипта var $ = jQuery;

Добавляем модальное окно iFrame (jQuery) в WordPress

Посмотрим, как всю эту красоту добавить в WordPress. По умолчанию – в WordPress библиотека jQuery подключена изначально. Да, есть  отдельные темы, которые её отключают при старте – что бы получить красивые показатели скорости загрузки. Но таких тем меньшинство.

Вариант 1 – работать будет, но не всегда.

Добавляем два блока

<style>...</style>
<script>...</script>

в head, например с помощью плагина Head & Footer Code

Делаем модальное окно iFrame с помощью jQuery для WordPress

Работать будет в 99%.

Для 100%  гарантии работы используем

Вариант 2 – добавляем скрипты средствами WordPress

Суть проблемы.

Что бы Ваш скрипт jQuery сработал – до его вызова гарантирована должна загрузиться сама библиотека jQuery. 

Нужно сделать два отдельных файла:

  • CSS (для стилей из содержимого <style>…</style> )
  • и JS (для кода jQuery из содержимого <script>…</script>) 

и подключить их с помощью функции wp_enqueue_style

Тогда WordPress корректно и правильно подключит стили CSS и код jQuery.

Новый виджет WP для вывода в сайдбаре списка авторов блога с аватарами

Да, еще один виджет списка авторов :)

Новый виджет WP для вывода в сайдбаре списка авторов блога с аватарами

Получилось симпатично. Сам плагин можно скачать в статье

Плагин вывода списка авторов блога (виджет)

В плагине tsl-plugin-list-author в настройках можно указать заголовок  и число авторов для вывода.

Новый виджет WP для вывода в сайдбаре списка авторов блога с аватарами

Под авторами подразумеваются все пользователи, у которых есть статьи (посты).

В качестве аватара автора используется картинка, установленная пользователем в сервисе Gravatar. Но с применением плагина Simple Local Avatars можно использовать картинку из медиатеки WordPress.

Плагин по умолчанию:

  • выводит список трех (по умолчанию – настраивается) авторов
  • сортировка авторов по числу публикаций
  • показ аватара автора
  • показ числа статей автора
  • ссылка с картинки на страницу автора
  • показ e-mail автора

 

В планах – показ общего числа просмотров статей каждого автора (в сумме) в виде:

  • 23 post (115 views)
  • 4 post (31 views)

Т.е. будет видно не только число статей автора, но и насколько этого автора читают :)

UPDATE:

Вышла новая версия плагина (widget) вывода списка авторов

Управление уведомлениями email WordPress

При различных действиях пользователя (регистрация, смена пароля, замена e-mail) – WordPress отправляет информационное сообщение на электронную почту.

Управление уведомлениями email WordPress

Всё, что у нас есть в базовой установке WordPress – только одна “галочка” при регистрации пользователя. Вот это.

Управление уведомлениями email WordPress

Но этого мало. Особенно, когда блог управляется одним админом, который и добавляет пользователей. Нужно как-то всю эту информационную реку отключить.

Используем плагин Manage Notification E-mails

Заходим в его настройки и видим, что наши возможности сильно расширились.

Управление уведомлениями email WordPress

Плагин не переведен на русский, смотрим перевод основных пунктов ниже.

Уведомление о новом пользователе для админаОтправка письма администратору сайта после регистрации нового пользователя.
Уведомление о новом пользователе для самого пользователяОтправка письма с учетными данными недавно зарегистрированному пользователю.
Уведомить автора постаОтправка письма автору поста после комментария / обратной связи
Уведомить модератораОтправка письма модератору блога о новом комментарии, ожидающем утверждения.
Уведомление об изменении пароля для администратораОтправка письма администратору сайта после смены пароля пользователя.
Уведомление об изменении пароля для пользователяОтправка письма пользователю после смены его пароля.
Уведомление об изменении адреса электронной почты пользователюОтправка письма пользователю после смены его электронной почты.
Отправка забытого пароля пользователюОтправить забытый пароль по электронной почте зарегистрированному пользователю.
(Чтобы предотвратить блокировку, отправка администратору электронного письма с забытым паролем по-прежнему будет работать)
Отправка забытого пароля админуОтправьте администраторам письмо с забытым паролем. Ладно, это ОПАСНЫЙ ВАРИАНТ!
Так что будьте осторожны, потому что отключение этой опции предотвращает отправку забытого пароля по электронной почте всем администраторам. Так что держите свой пароль и меняйте его на свой страх и риск ;-)
Уведомление об автоматическом обновлении ядра WPОтправляет администраторам электронное письмо после успешного автоматического обновления ядра WordPress. Электронные письма о неудачных обновлениях всегда будут отправляться администраторам и не могут быть отключены.

Что бы не забивать почту своих пользователей – два уведомления можно отключить:

  • Уведомление о новом пользователе для самого пользователя (галочка при регистрации останется – но не будет работать)
  • Уведомление об изменении адреса электронной почты пользователю

Плагин вывода анонсов постов в конце контента

Увеличим просмотры других статей автора, покажем дочерние страницы

Смотрим и устанавливаем плагин

Плагин вывода анонсов постов в конце контента

Вывод для записей (в конце контента)

Плагин вывода анонсов постов в конце контента

Вывод для страниц (в конце контента)

Плагин вывода анонсов постов в конце контента

Вывод последних публикаций:

  • по этому же автору
  • по этой же рубрике
  • последние статьи (с убыванием по дате)

 

Вывод списка последних 7 записей в конце каждого поста. 

Последние публикации –  в тегах H3

Названия постов в списке –  в тегах H4

    • Ник автора и ссылка на его посты
  • Название рубрики и ссылка на неё
    • миниатюра (ссылка на пост)
    • название поста (ссылка на пост)
    • дата публикации (с указанием прошедшего периода)
    • первые 700 символов текста поста

ВАЖНО: добавлено сокрытие логина пользователя при установке значений по умолчанию:

Вывод сообщения “Статьи от: Автор” :

  • если ник по умолчанию совпадает с логином
  • если отображаемое имя совпадает с логином
  • если в качестве ника или отображаемого имени используется
    • Admin (без учета регистра)
    • Administrator (без учета регистра)
    • Администратор

 

Вывод списка дочерних страниц:

Почитать в разделе –  в тегах H3

Названия страниц в списке –  в тегах H4

  • сортировка по названию
  • вывод миниатюры
  • вывод названия
  • первые 700 символов страницы

Дата и автор – не выводятся.

 

ВАЖНО: Выводится только миниатюра. При отсутствии миниатюры НЕ ИСПОЛЬЗУЕТСЯ первое изображение для показа.

Почему это важно? Если Вы используете в выводе первую картинку как заменитель миниатюры – у Вас на странице может оказаться 20 картинок * 100 Кб = 2 Мб лишних изображений. И Вы этого даже не заметите – т.к. вывод каждой картинки будет в рамках 100*100 pix. 

Миниатюра должна быть миниатюрой – т.е. маленькой.

Читаем статью

Миниатюры (thumbnails) записей и страниц WordPress

Используем плагин

Плагин добавления колонки featured image (миниатюра) в административной панели

Не пускаем ботов в админку WP (wp-login.php и xmlrpc.php)

Смотрим на логи сервера

Не пускаем ботов в админку WP (wp-login.php и xmlrpc.php)

 

Вот так выглядит счастье для сисадминов – если кто не знал:)

[Fri May 22 11:01:17.963061 2020] [client 18.197.84.84:56894] AH01630: client denied  : /wp-login.php
[Fri May 22 11:01:18.106043 2020] [client 18.197.84.84:56910] AH01630: client denied  : /wp-login.php
[Fri May 22 11:01:18.259101 2020] [client 18.197.84.84:56914] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:04:39.421585 2020] [client 2001:41d0:2:b55c:::46826] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:39.609779 2020] [client 2001:41d0:2:b55c:::46862] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:39.797490 2020] [client 2001:41d0:2:b55c:::46888] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:39.987180 2020] [client 2001:41d0:2:b55c:::46924] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:40.174743 2020] [client 2001:41d0:2:b55c:::46942] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:40.450029 2020] [client 2001:41d0:2:b55c:::46976] AH01630: client denied  : /wp-login.php
[Fri May 22 11:04:40.640164 2020] [client 2001:41d0:2:b55c:::47002] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:10:30.298825 2020] [client 206.196.116.67:52872] AH01630: client denied  : /wp-login.php
[Fri May 22 11:10:30.926579 2020] [client 206.196.116.67:52940] AH01630: client denied  : /wp-login.php
[Fri May 22 11:10:31.554545 2020] [client 206.196.116.67:53014] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:18:38.969303 2020] [client 35.185.199.45:45612] AH01630: client denied  : /wp-login.php
[Fri May 22 11:18:40.054804 2020] [client 35.185.199.45:45682] AH01630: client denied  : /wp-login.php
[Fri May 22 11:18:41.272080 2020] [client 35.185.199.45:45776] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:20:40.950042 2020] [client 148.66.135.69:55340] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:41.871050 2020] [client 148.66.135.69:55432] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:42.830788 2020] [client 148.66.135.69:55542] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:43.598987 2020] [client 148.66.135.69:55604] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:44.388140 2020] [client 148.66.135.69:55686] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:45.165568 2020] [client 148.66.135.69:55726] AH01630: client denied  : /wp-login.php
[Fri May 22 11:20:45.998620 2020] [client 148.66.135.69:55776] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:26:52.959616 2020] [client 2a03:b0c0:2:d0::563:6001:58866] AH01630: client denied  : /wp-login.php
[Fri May 22 11:26:58.127265 2020] [client 2a03:b0c0:2:d0::563:6001:59268] AH01630: client denied  : /wp-login.php
[Fri May 22 11:27:03.261629 2020] [client 2a03:b0c0:2:d0::563:6001:60032] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:34:04.001339 2020] [client 208.109.8.138:41174] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:05.053820 2020] [client 208.109.8.138:41252] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:06.107059 2020] [client 208.109.8.138:41322] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:07.168429 2020] [client 208.109.8.138:41380] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:08.235558 2020] [client 208.109.8.138:41436] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:09.310973 2020] [client 208.109.8.138:41492] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:10.373247 2020] [client 208.109.8.138:41558] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:34:40.989390 2020] [client 47.52.24.59:43850] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:42.660901 2020] [client 47.52.24.59:43966] AH01630: client denied  : /wp-login.php
[Fri May 22 11:34:44.105989 2020] [client 47.52.24.59:44054] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:42:28.978192 2020] [client 83.69.119.98:57360] AH01630: client denied  : /wp-login.php
[Fri May 22 11:42:29.185023 2020] [client 83.69.119.98:57378] AH01630: client denied  : /wp-login.php
[Fri May 22 11:42:29.376756 2020] [client 83.69.119.98:57394] AH01630: client denied  : /xmlrpc.php
[Fri May 22 11:50:14.127647 2020] [client 47.100.112.214:39108] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:16.307674 2020] [client 47.100.112.214:39274] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:17.584971 2020] [client 47.100.112.214:39356] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:19.088346 2020] [client 47.100.112.214:39464] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:19.997543 2020] [client 47.100.112.214:39536] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:20.954260 2020] [client 47.100.112.214:39632] AH01630: client denied  : /wp-login.php
[Fri May 22 11:50:22.080398 2020] [client 47.100.112.214:39702] AH01630: client denied  : /xmlrpc.php

За один час (22 мая 2020 с 11:00 до 12:00)

  • это не самый популярный сайт всего с 20 посетителями в день
  • 46 попыток войти в административную панель WordPress за один час
  • для попыток были использованы оба варианта wp-login.php и xmlrpc.php
  • в атаке принимали участие 10 компьютеров с разными IP

client denied (анг.) – клиенту отказано

В сутки 46*24 = порядка 1000 попыток заходов ботов в админку. Плюс еще столько же желающих задать вариант скрипта php в строке браузера + еще 1000 какой-либо код в форму обратной связи вставить.

Итого 3000 ботов в сутки против визитов 20 живых людей на сайт. 

Их всех на входе отбил Apache. Если бы запрос дошел до сервера PHP с WordPress – то нагрузка процессора была бы на уровне 90%-100%. Пароль  бы они не подобрали – но сервер заняли бессмысленной работой и обычный посетитель сайт  в выдаче скорее всего не получил (с ошибкой 503 Service Unavailable).

Как настроить защиту WordPress – читаем в статье

Защита WP