Zola2 // Tout // Rien // Surtout Rien

Bloquer les tentatives de brute force de WordPress sur l’ensemble d’un serveur

octobre28

A la place d’installer un plugins pour bloquer les tentatives de connexion à votre panel d’administration de WordPress qui va alourdir votre WordPress, le plus simple est d’ajouter une règle sur « fail2ban » :

Dans le dossier « /etc/fail2ban/filter.d/ » ajouter le fichier : apache-wp.conf avec comme contenu :

[Definition]

#failregex = ^. * “POST. * / wp-login \. php HTTP. * 200e * $
failregex = ^<HOST> -.*POST /wp-login.php HTTP.*
ignoreregex =

Editer ensuite le fichier /etc/fail2ban/jail.conf et ajouter à la fin (en modifiant la dernière ligne pour indiquer l’adresse de vos logs apache) :

[apache-wp]
enabled = true
port = http,https
filter = apache-wp
logpath = /var/log/apache2/*_access_log

On relance fail2ban :

./etc/init.d/fail2ban restart

Et voila 🙂

Pour suivre l’évolution installer par exemple munin 😉

Forcer l’admin de WordPress en SSL

octobre28

Rien de plus simple suffit d’ajouter dans le fichier « wp-config.php » avant la ligne « /* C’est tout, ne touchez pas à ce qui suit ! Bon blogging ! */ » :

define(‘FORCE_SSL_LOGIN’, true);
define(‘FORCE_SSL_ADMIN’, true);

Supprimer des doublons dans une table MySQL

novembre2

Pratique et rapide pour supprimer des doublons dans une table MySQL :

ALTER IGNORE TABLE  table ADD UNIQUE INDEX(champA,champB); 

Prestashop : remise à zéro des commandes

octobre20

Lors de l’utilisation de Prestashop, de sa configuration, son adaptation, il est souvent nécessaire de supprimer les commandes test effectuées avant la mise en ligne, il est nécessaire de vider manuellement des tables, voici les requêtes SQL :

TRUNCATE TABLE `ps_customer`;
TRUNCATE TABLE `ps_address`;
TRUNCATE TABLE `ps_orders`;
TRUNCATE TABLE `ps_order_detail`;
TRUNCATE TABLE `ps_order_discount`;
TRUNCATE TABLE `ps_order_history`;
TRUNCATE TABLE `ps_message`;
TRUNCATE TABLE `ps_cart`;
TRUNCATE TABLE `ps_cart_product`;
TRUNCATE TABLE `ps_cart_discount`; 
TRUNCATE TABLE `ps_order_return`;
TRUNCATE TABLE `ps_order_return_detail`; 

Disque externe : automatiser une backup distante avec un My Book World Edition

août23

Les disques dur ethernet Western Digital My Book World Edition (version led blanche) ont une version de linux AMR ambarqué. Il est donc possible d’ajouter des petites applications et d’y mettre des crons, donc d’automatiser par exemple une sauvegarde du contenu chaque nuit sur un serveur spécifique…

1ere étape, installer un gestionnaire de package :

Quand vous êtes connecté en ssh (login : admin, mot de passe : Welc0me), voici les commandes à lancer pour installer le gestionnaire :

feed=http://ipkg.nslu2-linux.org/feeds/optware/cs05q1armel/cross/unstable
ipk_name=$(wget -qO- $feed/Packages | awk ‘/^Filename: ipkg-opt/ {print $2}’)
wget $feed/$ipk_name
tar -xOvzf $ipk_name ./data.tar.gz | tar -C / -xzvf –
mkdir -p /opt/etc/ipkg
echo « src armel http://ipkg.nslu2-linux.org/feeds/optware/cs05q1armel/cross/unstable » > /opt/etc/ipkg/armel-feed.conf
wget http://mybookworld.wikidot.com/local–files/optware/sort_dirname.tar.gz
tar xvfz sort_dirname.tar.gz -C /

Installez nano :

/opt/bin/ipkg install nano

Installez lftp :

/opt/bin/ipkg install lftp

Pour lancer une application installée, par exemple nano :

/opt/bin/nano

Créer un script shell pour lancer la backup :

Via nano : /opt/bin/nano /root/backup.sh

/opt/bin/lftp ftp://identifiant:mot_de_passe@site_de_connexion -e « mirror -e -R /emplacement_local /emplacement_distant ; quit »

Ctrl+O pour sauver

Un p’tit coup de chmod +x pour le passer en executable :

chmod +x /root/backup.sh

Ensuite on ajoute la tache dans le cron et le tour est joué !

Mise en place du cron

Créez le fichier /etc/init.d/S99crond

#!/bin/sh

# Script to enable crond (Dillon’s cron) on My Book whitelight (WWLXN-WDH1NC)
#                                                                              
# Since /var/spool links to /tmp the default crontabs location in              
# /var/spool/cron/crontabs will get blown out on reboot. Instead we’ll
# map the crontabs to /etc/crontabs                   
#                                                     
# Put this script in /etc/init.d/S99crond and chmod 755

check_crontabs() {
        if test ! -d /etc/crontabs ; then
                echo « Creating /etc/crontabs »
                mkdir /etc/crontabs
                echo « # crond control file for root (system) » > /etc/crontabs/root
                echo « # Restart crond after editing (/etc/init.d/S99crond restart) » >> /etc/crontabs/root
                echo « # m h dom mon dow   command » >> /etc/crontabs/root
                echo « # Uncomment next line and restart crond to test » >> /etc/crontabs/root
                echo « #* * * * * touch /tmp/crontab.test » >> /etc/crontabs/root
                ln -sf /etc/crontabs/root /etc/crontab
        fi
}

is_running() {
        PID=`ps aux | grep « crond -c \/etc\/crontabs » | grep -v grep | sed ‘s/^ *//’ | cut -f 1 -d ‘ ‘`
        if test -z $PID ; then
                return 0
        else
                return 1
        fi
}

start() {
        check_crontabs
        echo -n « Starting crond: « 
        is_running
        if test $? -eq 0 ; then
                /usr/sbin/crond -c /etc/crontabs
                touch /var/lock/crond
                echo « OK »
        else
                echo « crond is already running »
        fi
}      

stop() {
        echo -n « Stopping crond: « 
        is_running
        if test $? -eq 1 ; then
                killall crond
                rm -f /var/lock/crond
                echo « OK »
        else
                echo « crond is not running »
        fi
}

restart() {
        stop
        start
}      

case « $1 » in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart|reload)
                restart
                ;;
        *)
                echo $ »Usage: $0 {start|stop|restart} »
                exit 1
esac

exit $?

Ensuite effecuté un chmod 755 sur ce script
Lancez le.

Vous pouvez maintenant éditer votre crontab via le fichier /etc/crontab

SVN / Tortoise : Error bumping revisions post-commit / Erreur en incrémentant les révisions après la propagation

mars26

Il arrive parfois qu’avec Tortoise lors d’un commit (souvent sur des fichiers binaires) on rencontre l’erreur :

Erreur en incrémentant les révisions après la propagation / Error bumping revisions post-commit 

Et même en faisant un clean, rien toujours le même soucis ! Il est alors nécessaire de supprimer le dossier et de faire un nouvel export !

Le problème est existant uniquement sur des partages Samba, il faut modifier la configuration Samba vérifiant la présence de :

browsable = yes
create mask = 0644
force create mode = 0600
security mask = 0555
force security mode = 0600

Protection injection SQL

février6

Le piratage de site web se fait le plus souvent via des injections SQL.

Il existe plusieurs solutions pour se protéger contre ce genre d’attaques.

La première est simple suffit de bien coder ses requêtes et de protéger les variables qu’on intègre.

  • Toujours utiliser la fonction : « mysql_real_escape_string » :
$requete="SELECT champ 
FROM table
WHERE id='".mysql_real_escape_string($variable)."'";
  • Ne pas faire de « SELECT * »
  • Si vous chercher uniquement un enregistrement dans une table ajouter à la fin « LIMIT 0,1 »
  • Si vous utiliser une variable numérique dans une requête vérifier qu’elle est vraiment numérique, via les différentes fonctions : is_numeric(), is_int(), is_integer(), …
  • tronquer les variables, si vous savez que la variable que vous intégrer dans votre requête ne dépasse par exemple jamais 10 caractères : substr($variable,0,10
  • On peux aussi utiliser un fichier .htaccess, exemple :

RewriteEngine On
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)base64_encode(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)(SELECT|INSERT|DELETE|CHAR\(|UPDATE|REPLACE|LIMIT)(.*)$
RewriteRule (.*) - [F]

Transformer des secondes en heures

février6

Dans les calculs de date on a souvent besoin de transformer les secondes en heures… voici une petite fonction simple permettant de le faire :

function secondetoheure ($temps)
    {
    $heures = floor ($temps / 3600);
    $minutes = floor(($temps - ($heures * 3600)) / 60);
    if ($minutes < 10)
        {        
        $minutes = "0".$minutes;
        }
    $secondes = $temps - ($heures * 3600) - ($minutes * 60);
    if ($secondes < 10)
        {
        $secondes = "0".$secondes;
        }
    if ($heures < 10)
        {
        $heures = "0".$heures;
        }
    return $heures.':'.$minutes.':'.$secondes;
    }

Soundex, version francisée !

février6

L’utilisation de la fonction Php de soundex est bien pratique, par exemple pour faire un moteur de recherche phonétique… malheureusement elle se base sur une phonétique anglophone… donc au final… c’est un peu bloquant pour un développement d’un progiciel ou d’un outil qui cause français… voici donc une fonction permettant d’avoir une version soundex francophone :

function soundex_fr($sIn) 
{
    static $convVIn, $convVOut, $convGuIn, $convGuOut, $accents;
    if (!isset($convGuIn)) {
        $accents = array(
'É' => 'E', 'È' => 'E',
'Ë' => 'E', 'Ê' => 'E',
'Á' => 'A', 'À' => 'A',
'Ä' => 'A', 'Â' => 'A',
'Å' => 'A', 'Ã' => 'A',
'Ï' => 'I', 'Î' => 'I',
'Ì' => 'I', 'Í' => 'I',
'Ô' => 'O', 'Ö' => 'O',
'Ò' => 'O', 'Ó' => 'O',
'Õ' => 'O', 'Ø' => 'O',
'Ú' => 'U', 'Ù' => 'U',
'Û' => 'U', 'Ü' => 'U',
'Ç' => 'C', 'Ñ' => 'N',
'Ç' => 'S', '¿' => 'E',
'é' => 'e', 'è' => 'e',
'ë' => 'e', 'ê' => 'e',
'á' => 'a', 'à' => 'a',
'ä' => 'a', 'â' => 'a',
'å' => 'a', 'ã' => 'a',
'ï' => 'i', 'î' => 'i',
'ì' => 'i', 'í' => 'i',
'ô' => 'o', 'ö' => 'o',
'ò' => 'o', 'ó' => 'o',
'õ' => 'o', 'ø' => 'o',
'ú' => 'u', 'ù' => 'u',
'û' => 'u', 'ü' => 'u',
'ç' => 'c', 'ñ' => 'n');

$convGuIn  = array(
'GUI', 'GUE', 'GA',
'GO', 'GU', 'SCI',
'SCE', 'SC', 'CA',
'CO', 'CU', 'QU',
'Q', 'CC', 'CK',
'G', 'ST', 'PH');
       
$convGuOut = array(
'KI', 'KE', 'KA',
'KO', 'K', 'SI',
'SE', 'SK', 'KA',
'KO','KU', 'K',
'K', 'K', 'K',
'J', 'T', 'F');
       
$convVIn   = array(
'/E?(AU)/', '/([EA])?[UI]([NM])([^EAIOUY]|$)/',
'/[AE]O?[NM]([^AEIOUY]|$)/',                            
'/[EA][IY]([NM]?[^NM]|$)/',
'/(^|[^OEUIA])(OEU|OE|EU)([^OEUIA]|$)/',
'/OI/', '/(ILLE?|I)/',
'/O(U|W)/', '/O[NM]($|[^EAOUIY])/',
'/(SC|S|C)H/', '/([^AEIOUY1])[^AEIOUYLKTPNR]([UAO])([^AEIOUY])/',
'/([^AEIOUY]|^)([AUO])[^AEIOUYLKTP]([^AEIOUY1])/', '/^KN/',
'/^PF/', '/C([^AEIOUY]|$)/',  '/E(Z|R)$/',
'/C/', '/Z$/', '/(?<!^)Z+/', '/H/', '/W/');

$convVOut  = array(
'O', '1\3', 'A\1',
'E\1', '\1E\3', 'O',                            
'Y', 'U', 'O\1', '9',-
'\1\2\3', '\1\2\3', 'N',
'F', 'K\1', 'E',
'S', 'SE', 'S', '', 'V');
    }

// Si il n'y a pas de mot, on sort immédiatement
if ( $sIn === '' ) return '    ';

// On supprime les accents-
$sIn = strtr( $sIn, $accents);
   
// On met tout en minuscule-
$sIn = strtoupper( $sIn );
   
// On supprime tout ce qui n'est pas une lettre   
$sIn = preg_replace( '`[^A-Z]`', '', $sIn );

// Si la chaîne ne fait qu'un seul caractère, on sort avec.   
if ( strlen( $sIn ) === 1 ) return $sIn . '   ';

// on remplace les consonnances primaires
$sIn = str_replace( $convGuIn, $convGuOut, $sIn );

// on supprime les lettres répétitives
$sIn = preg_replace( '`(.)\1`', '$1', $sIn );

// on réinterprète les voyelles
$sIn = preg_replace( $convVIn, $convVOut, $sIn);
 
// on supprime les terminaisons T, D, S, X (et le L qui précède si existe)
$sIn = preg_replace( '`L?[TDX]?S?$`', '', $sIn );
 
// on supprime les E, A et Y qui ne sont pas en première position
$sIn = preg_replace( '`(?!^)Y([^AEOU]|$)`', '\1', $sIn);
$sIn = preg_replace( '`(?!^)[EA]`', '', $sIn);

return substr( $sIn . '    ', 0, 4);
}

Remplacer des occurences dans un contenu d’une table

septembre14

Il arrive souvent lors de l’édition d’un contenu via un CMS que les images insérées comporte le chemin complet du site et lors de la mise en ligne cela pose problème… une édition à la main étant surtout fastidieuse !

Voici une requête pour effectuer un remplacement :

UPDATE table SET champ = REPLACE(champ ,'recherche','remplace');
« Older Entries