Предотвращение атак на WordPress xmlrpc.php и wp-login.php

Заметил однажды на некоторых серверах с WordPress сайтами большое количество обращений к файлу xmlrpc.php и wp-login.php

Как оказалось кто-то пытался подобрать пароль и получить доступ к сайту, обычно такие вещи блокирует Jetpack, ограничивается доступ по IP в админку средствами веб-сервера, но на этих почему-то никакой защиты не было.

Посчитать количество обращений к файлу в логах можно командой:

grep 'xmlrpc.php' /var/log/apache2/access.log | wc -l

Кстати команду выше можно выполнять например из системы мониторинга Zabbix, рисовать по полученным данным график, а также уведомлять о увеличении количества обращений.

Посчитать количество по каждому IP и вывести список:

grep 'xmlrpc.php' /var/log/apache2/access.log | cut -d' ' -f1 | sort | uniq -c | sort -r

Посчитать количество по каждому IP и вывести список для файла wp-login.php:

grep 'wp-login.php' /var/log/apache2/access.log | cut -d' ' -f1 | sort | uniq -c | sort -r
grep 'wp-login.php' /var/log/apache2/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20

В конфигурации apache2 или через файл .htaccess можно ограничить доступ к директории /wp-admin/ по IP, например так:

<Directory /var/www/site/wp-admin/>
  Options -Indexes
  AllowOverride All
  Order allow,deny
  allow from 127.0.0.1 192.168.11.25
</Directory>

Полностью запретить доступ к файлам так:

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

Если используется например Jetpack, то к wp-login.php лучше не ограничивать, так как могут возникнуть ошибки при обновлении плагина и отразится на его работе.
В этом случае можно активировать защиту от подбора пароля в параметрах Jetpack.

Если Jetpack не используется можно установить другие плагины, например «WP Limit Login Attempts», который отображает капчу при авторизации, а также блокирует неверные попытки входа.
Например плагином «Disable XML-RPC Pingback» можно отключить функции XML-RPC если они не нужны.

Также в файле robots.txt можно запретить индексирование поисковиками этих файлов:

User-agent: *
Disallow: /xmlrpc.php
Disallow: /wp-login.php

Скрипт отправки СМС через Goip4 шлюз

Приведу пример скрипта написанного на PHP, для отправки СМС сообщений через Goip4 шлюз.
Скрипт получает данные из базы SQL запросом и поочередно отправляет СМС на каждый номер, а также заносит запись об отправке в специальную таблицу sms.

#!/usr/bin/php

<?php

include("config/config.inc.php");
include("config/connect.inc.php");


$Result = mysqli_query($db,
"
SELECT
    abon.first_name,
    abon.second_name,
    abon.id as id,
    abon.depozit as balance,
    abon.id,
    abon.otkl,
    abon.mobile,
    abon.tarif,
    new_tarif.cost_day,
    new_tarif.cost as cost_month,
    new_tarif.dayORmonth as period
FROM
    abon, new_tarif
WHERE
    abon.tarif = new_tarif.id AND abon.state=1 AND abon.killed='' AND abon.tarif=114
"
);


while($Row = mysqli_fetch_array($Result))
{
$user = $Row[id];
$balance =$Row[balance];
$phone = $Row[mobile];

$phone_length=strlen($phone);

if($phone_length==10)
{
$mess_ = "Текст сообщения. На вашем счету $balance";
$mess =  rawurlencode($mess_);

print("$phone           $mess_\n");

//test phone
//$phone = "0670000000";
$r = file_get_contents("http://192.168.22.10/goip/en/dosend.php?USERNAME=ЛОГИН&PASSWORD=ПАРОЛЬ&smsprovider=3&goipname=lifecell&smsnum=$phone&method=2&Memo=$mess");
mysqli_query($db, "INSERT INTO sms VALUES(NULL, '$user', '$phone', NOW(), '$mess_', '$balance')");
//print($r);
//exit();

}
}
?>

Содержимое config.inc.php:

<?php
$mysql_host="localhost";
$mysql_user="ЛОГИН";
$mysql_password="ПАРОЛЬ";
$mysql_base="БАЗА";
?>

Содержимое connect.inc.php:

<?php
$db=mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_base);
mysqli_query($db, "SET NAMES 'utf8'");
?>

Установка модуля PageSpeed

На тесте утановлю модуль PageSpeed в Ubuntu Server 14.04.5 LTS и CentOS

Страница загрузки с разными версиями модуля https://modpagespeed.com/doc/download
https://developers.google.com/speed/pagespeed/module/

И так, скачаем стабильную версию для Debian/Ubuntu:

sudo wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb

Или для CentOS/Fedora:

https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm

Установим в Ubuntu, модуль автоматически активируется:

sudo dpkg -i mod-pagespeed-*.deb
sudo apt-get -f install

В CentOS так:

sudo yum install at
sudo rpm -U mod-pagespeed-*.rpm

Перезапустим apache2 чтобы применить изменения:

sudo service apache2 restart
sudo /etc/init.d/apache2 restart

Все, модуль установлен.

Обновлять в дальнейшем он будет вместе с системой командами:

sudo apt-get update
sudo apt-get upgrade

При необходимости деактивировать/активировать модуль можно командами:

sudo a2dismod pagespeed
sudo a2enmod pagespeed

Либо полностью удалить:

sudo apt-get remove mod-pagespeed-stable
sudo yum remove mod-pagespeed-stable

Файлы конфигурации модуля находятся по адресам:
etc/apache2/mods-available/pagespeed.conf
/etc/httpd/conf.d/

Решение проблемы SSL «Connection is not secure — Parts of this page are not secure (such as images)»

Заметил однажды одном сайте с подписанным SSL сертификатом, сообщение от браузера Mozilla Firefox:

Connection is not secure — Parts of this page are not secure (such as images)

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

Если сайт работает по http:// и https://, а картинки находятся на нем же, то ссылки нужно изменить например с:

<img src="http://www.ixnfo.com/img.jpg">

на

<img src="/img.jpg">

Все.

Список онлайн сервисов для тестирования сайта

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

Проверки скорости загрузки сайта
https://developers.google.com/speed/pagespeed/
https://tools.pingdom.com/
https://www.webpagetest.org/
https://gtmetrix.com/

Тест сайта в разных браузерах
https://browsershots.org/

Тест сайта на количество соединений
https://loadimpact.com/

Проверка на орфографические ошибки
https://tech.yandex.ru/speller/

Проверки доступности сайта
https://www.host-tracker.com/
http://ping-admin.ru/free_test/

Прочие сервисы
http://www.yougetsignal.com
https://builtwith.com/
https://www.onlinewebcheck.com/

Совет: чтобы в Google выполнить поиск только по конкретному сайту, необходимо в строке поиска добавить название сайта, например site:ixnfo.com

Как удалить W3 Total Cache плагин из WordPress

Для удаления W3 Total Cache из WordPress нужно:

1) В меню плагина нажать кнопку очистки кеша.

2) Деактивировать плагин в меню плагинов и там же нажать «Удалить»

3) В корневой директории сайта, в начале файла wp-config.php, если остались, удалить строки:

/** Enable W3 Total Cache Edge Mode */
define('W3TC_EDGE_MODE', true); // Added by W3 Total Cache

/** Enable W3 Total Cache */
define('WP_CACHE', true); // Added by W3 Total Cache

4) Как я заметил после плагина остается много файлов, а на крупных сайтах могут остаться миллионы файлов с кешированными данными.
В директории wp-content удалим файлы, если они есть, advanced-cache.php, object-cache.php, директории w3tc-config и cache (здесь кешированные данные).

Все.

PHP скрипт «ТОП должников АСРМ «Ника»»

Приведу пример PHP кода отображающего список должников из базы данных АСРМ «Ника»:

<?php
// данные доступа к базе данных
$db_host="192.168.1.1";
$db_user="user";
$db_password="password";
$db_name = "base";
$table_name = "abon";

// соединение с БД
mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error());
mysql_query("SET NAMES 'utf8'");

// запрос
$query = 'SELECT * FROM `'.$table_name.'` WHERE `depozit`<0 ORDER BY `depozit` ASC LIMIT 100;';
$sql = mysql_query($query);

// обрабатываем полученный результат
// количество
$num_rows = mysql_num_rows($sql);
echo $num_rows.' должников показано:<br />';

// выводим данные
while ($sql_data = mysql_fetch_array($sql)) {
    echo '<table cellpadding="5" cellspacing="3" border="0"><tr><td>';
    echo '<tr><td>'.$sql_data['depozit'].'</td><td>'.$sql_data['id'].'</td><td>'.$sql_data['first_name'].'</td><td>'.$sql_data['second_name'].'</td></tr>';
    echo '</tr></td></table>';
}
?>

Смотрите также:
Простое кеширование страниц