Eigen plug-in, (spam)bots tegenhouden

Ingediend door Dirk Hornstra op 31-mar-2018 23:02

Als je jouw site met Joomla laat werken, dan hoop ik dat je weet wat je doet. In ieder geval dat je jouw versie bijgewerkt hebt naar de meest recente versie (3.8.6 op 31 maart 2018). Neem je ook zo nu en dan een kijkje in het bestand error.php in de map /logs ? Want dan zul je waarschijnlijk zien dat je site flink onder vuur ligt. Dit is een deel van wat ik in het bestand had staan:


 

2018-03-31T16:07:00+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:01+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:02+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:04+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:06+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:07+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.
2018-03-31T16:07:09+00:00   INFO 5.188.62.49    joomlafailure   De combinatie van gebruikersnaam en wachtwoord is niet correct of u heeft nog geen account.

Hier probeer iemand dus continu in te loggen. Tijd om actie te ondernemen. Ik zou dat al eerder doen, maar ja, tijd is iets waar ik een chronisch tekort aan heb ;)
Ik vang nu af dat het inloggen verkeerd gaat. Voer je een foutieve gebruikersnaam in, dan zet ik je ip-adres meteen in de .htaccess in de administrator map. Hierdoor kun je geen posts meer uitvoeren en dus geen inlogpogingen meer uitvoeren. Voer je wel een geldige gebruikersnaam in, maar voer je 2x of vaker een verkeerd wachtwoord in, dan wordt je ook meteen geblokkeerd. Klinkt misschien wat rigoureus, maar we gaan eerst maar eens kijken of er nog een soort "unlock"-mogelijkheid moet komen of dat dit een afdoende oplossing is.

Ik heb een 3-tal bestanden gemaakt. Een lege index.html
Een spambots.xml met de volgende inhoud:


 

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system">
    <name>plg_system_spambots</name>
    <author>Joomla! Project</author>
    <creationDate>March 2018</creationDate>
    <copyright>Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <authorEmail>...</authorEmail>
    <authorUrl>www.dirkhornstra.nl</authorUrl>
    <version>3.1.0</version>
    <description>Spambots blokkeren</description>
    <files>
        <filename plugin="spambots">spambots.php</filename>
        <filename>index.html</filename>
    </files>
    <languages/>
    <config>
        <fields name="params" />
    </config>
</extension>

Een spambots.php het de volgende inhoud:


 

<?php
// no direct access
defined( '_JEXEC' ) or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Factory;

class PlgSystemSpambots extends JPlugin
{
    public function onUserLoginFailure($response)
    {
        try
        {
            if (isset($response["username"])){
            global $_SESSION;
            if (isset($_SESSION["dotk_failed_logins"])) {
                $_SESSION["dotk_failed_logins"] = intval($_SESSION["dotk_failed_logins"]) + 1;
            }
            else {
                $_SESSION["dotk_failed_logins"] = 1;
            }
           $un = $response["username"];
           $db = Factory::getDbo();

           $query = $db->getQuery(true);
           $query->select ('COUNT(1) AS aantal');
           $query->from($db->quoteName('#__users', 'u'));
           $query->where('u.username = ' . $db->quote($un));
           $db->setQuery($query);

           if (($db->loadObject()->aantal == 0)||($_SESSION["dotk_failed_logins"] >= 2)) {
$htAccessCurrent = <<< EOT
# SPAM BOTS TOEGANG ONTZEGGEN
<Limit POST PUT>
order allow,deny
allow from all
#IPADDRESSES#
</Limit>
EOT;

            chdir(JPATH_ADMINISTRATOR);
            if (file_exists(".htaccess")){
                $htFile = file_get_contents(".htaccess");
                $lines = explode("\n",$htFile);
                while(list($k,$v)=each($lines)){
                    if (strpos("_".$v, "deny from")>0) {
                         $htAccessCurrent = str_replace("#IPADDRESSES#", $v."\n#IPADDRESSES#", $htAccessCurrent);
                   }
                }
           } 

          global $_SERVER;
          $htAccessCurrent = str_replace("#IPADDRESSES#", "deny from ".$_SERVER["REMOTE_ADDR"], $htAccessCurrent);
          file_put_contents(".htaccess", $htAccessCurrent);
      }
    }
    }
    catch (Exception $e)
    {
    // If the log file is unwriteable during login then we should not go to the error page
         return;
    }
  }
}
?>

Deze bestanden heb ik gezipt naar spambots.zip. Onder extensies, beheren, tabblad Installeren. Hier het zipbestand geupload. Dat gaat goed. Dan moet je de plug-in nog activeren. Ga naar Extensies, plugins. Zoek daar op spambots. Klik in de kolom status op het rode rondje zodat het een groen vinkje wordt. Je bent klaar, hij is actief!