Catégories
Trucs et astuces

Comment remettre le « http:// » dans la barre d’adresse de Firefox 7

Avec la sortie de Firefox 7 quelques changements que je ne désire pas sont apparus :

  • la fausse bonne idée (à mon sens) de masquer la chaîne « http:// » dans la barre d’adresse à été reprise chez Google,
  • toujours dans l’URL, seul le nom de domaine (« example.com ») est mis en surbrillance , pas les sous‐domaines, ni le chemin de la ressource

Pour rétablir l’ancien comportement :

  • il faut mettre browser.urlbar.trimURLs à false (dans about:config).
  • l’option browser.urlbar.formatting.enabled qui grise toutes les parties de l’URL en dehors du domaine est elle aussi désactivable en mettant la valeur à false.
Catégories
Humeur Trucs et astuces

Orange/Wanadoo et « Too many connections, slow down. OFR004_104 [104]) »

Depuis le 17 décembre environ, Orange a modifié (une fois de plus) le fonctionnement de ses serveurs de mail.
Cette fois la conséquence est la suivante : très rapidement lors d’un mailing les serveurs d’Orange refusent les mails avec le message suivant :

Dec 20 12:32:33 ns303007 postfix/smtp[6102]: B454432E76: to=, relay=smtp.wanadoo.fr[80.12.242.82]:25, delay=23, delays=0.02/0/23/0, dsn=4.0.0, status=deferred (host smtp.wanadoo.fr[80.12.242.82] refused to talk to me: 421 mwinf5c30 ME Trop de connexions, veuillez verifier votre configuration. Too many connections, slow down. OFR004_104 [104])


La file des messages se rempli alors très rapidement pour monter facilement à plusieurs dizaine de milliers de mails en attente d’envoi et surtout totalement bloqués !

Autre souci les mails sont en status deferred, et seront donc supprimé de la file dans un délai de 5 jours par défaut (voir la configuration de maximal_queue_lifetime). C’est insuffisant pour laisser s’écouler les mails en attente !

Pour les serveurs de mail que je gère j’ai « bidouillé » un script pour vider manuellement la queue pour les mails destinés à Orange/Wanadoo afin que les personnes aient leur mail au plus tôt !
Mais il fallait trouver une solution plus durable…

J’en ai mise une en place, elle n’est pas parfaite mais elle a permis de gérer et de délivrer les mailings de ces fêtes de fin d’année en temps et en heure !

Détails de la solution : transport spécifique pour orange/wanadoo

/etc/postfix/transport


wanadoo.com slow:
wanadoo.fr slow:
orange.com slow:
orange.fr slow:

puis postmap /etc/postfix/transport

dans /etc/postfix/master.cf


#==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
#==========================================================================
slow unix - - n - 5 smtp
-o syslog_name=postfix-slow
-o smtp_destination_concurrency_limit=3
-o slow_destination_rate_delay=1

dans /etc/postfix/main.cf


slow_destination_recipient_limit = 20
slow_destination_concurrency_limit = 2

et finalement : /etc/init.d/postfix reload

Les mails se stockent tout de même en queue, mais la file se vide ensuite relativement rapidement !

Catégories
Linux Trucs et astuces

Aspirer un site internet pour une consultation hors-ligne

Il doit certainement exister des logiciels avec possibilité de filtres et de dizaines d’autres options, mais pour la plupart des cas cette simple commande me suffit :

wget -r -k -np -T 10 -t 1 http://www.zapoyok.info

  • -r : signifie que le téléchargement sera récursif et suit les liens présent dans la page
  • -k : permet de reconstituer le site localement afin d’être consultable hors connexion : les liens sont modifié pour pointer localement
  • -np empêche de remonter dans le répertoire parent.
  • -T 10 : Time connection. Le temps max en seconde pour aspirer un lien. Quand cette option est omis, un lien difficilement accessible peut ralentir considérablement l’aspiration du site.
  • -t 1 : nombre de tentative de connexion si il y a erreur 404 (pas de lien). Ici, on veut qu’il n’y ait qu’une seule tentative de connexion afin d’accélérer le traitement d’aspiration.
Catégories
Linux Trucs et astuces

git svn clone …. et « temp file with moniker ‘svn_delta’ already in use »

Lors d’essai de cloner des dépôts SVN pour travailler dessus avec GIT, je me retrouve chaque fois avec la même erreur :
Temp file with moniker 'svn_delta' already in use at /usr/share/perl5/Git.pm line 1022. avec git 1.7.1 et Subversion 1.6.12

Après quelques recherches infructueuses une piste et une solution (à mon problème en tout cas). Dans le fichier ~/.subversion/servers j’avais la section suivante :

[global]
http-library = serf

Une simple suppression de cette ligne pour réutiliser Neon par défaut et cela marche tout de suite mieux !
Je ne sais pas vraiment le pourquoi du comment, mais si cela aide quelqu’un à son tour c’est tant mieux !

Pour en savoir plus :
http://git.661346.n2.nabble.com/git-svn-fails-to-fetch-repository-td2151475.html
http://subversion.tigris.org/issues/show_bug.cgi?id=2932

Catégories
Linux Trucs et astuces

Installer Flash sous Debian Testing « Squeeze » amd64

Suite aux nombreuses failles sur le plugin Flash, Adobe a jeté l’éponge et ne maintient plus son plugin en version 64 bits (Lire l’annonce d’Adobe.)

Il reste dès lors peu de solutions :

  • Revenir sur une distrib 32 bits
  • Installé − à l’instar de windows − le plugin en version 32 bits
  • chrooter complètement son environnement pour avoir un Firefox en 32 bits dans son environnement 64
  • Se passer de flash
  • Installer des alternatives : gnash,…

Je vais retenir l’installation du plugin en version 32 bits.
La méthode est entièrement décrite à l’adresse suivante : http://wiki.debian.org/FlashPlayer et plus particulièrement : « Installation sous Squeeze AMD64 »

Je cite :

Debian Testing ‘Squeeze’ amd64

Currently not supported by Adobe. See the announcement by Adobe and bug #586273.

However, there is a workaround:

  1. aptitude install fakeroot binutils nspluginwrapper ia32-libs
  2. Download and run this script: http://people.debian.org/~bartm/flashplugin-nonfree/ia32-libs-workaround-499043-squeeze.sh
  3. dpkg -i ia32-libs-workaround-499043_0.0.1+squeeze1_amd64.deb
  4. Install this package: http://people.debian.org/~bartm/flashplugin-nonfree/flashplugin-nonfree_10.1.53.64.1_amd64.deb

Note (21/08/2010) : Aller voir régulièrement à la page « Installation sous Squeeze AMD64 », les paquets et leur version changent de temps à autre !

An entirely different approach is to install a browser and the 32 bit plugin in an i386 chroot as described in the AMD64 HOWTO.

Catégories
Linux Trucs et astuces

Supprimer les tentatives d’accès à phpMyAdmin en utilisant fail2ban

Comme beaucoup de monde il m’arrive d’être « scanné » sur mon serveur Web pour accéder à phpMyAdmin ou en exploiter une faille.

On trouve ce genre d’info dans les mails quotidiens généré par logwatch par exemple.

--------------------- httpd Begin ------------------------ 
 
 Requests with error response codes
   […]
    404 Not Found
       /PMA/scripts/setup.php: 1 Time(s)
       /PMA2005/scripts/setup.php: 1 Time(s)
     […]
       /phpMyAdmin-2.3.0/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.1/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.2/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.3/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.4/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.5/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.6/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.7/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.8/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.3.9/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.4.0/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.4.1/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.4.2/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.4.3/scripts/setup.php: 1 Time(s)
       /phpMyAdmin-2.4.4/scripts/setup.php: 1 Time(s)
     […]
 
 ---------------------- httpd End -------------------------

Pour y remédier :

  • Ne pas l’installer !
  • N’autoriser que certaines IPs à y accéder
  • Utiliser fail2ban pour limiter et contrer l’effet des scans

Utilisation de fail2ban

J,ai trouvé un script tout fait… alors pourquoi se compliquer la vie ! Il est disponible à l’adresse suivante : http://foosel.org/blog/2008/04/banning_phpmyadmin_bots_using_fail2ban.

Je le reprend ci-dessous avec quelques adaptations :

/etc/fail2ban/filter.d/apache-phpmyadmin.conf

# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
#
 
[Definition]
 # Option:  failregex
# Notes.:  Regexp to match often probed and not available phpmyadmin paths.
# Values:  TEXT
#
failregex = [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)
 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Activer le filtre dans le fichier de configuration : /etc/fail2ban/jail.conf :

[apache-phpmyadmin]
enabled  = true
port     = http,https
filter   = apache-phpmyadmin
logpath  = /var/log/apache/error.log
maxretry = 3
Catégories
PHP Trucs et astuces

Protection de vos scripts PHP : validation des données, XSS, CSRF,…

Aujourd’hui je commence une série d’articles sur quelques points de sécurité et de bon sens avec PHP.
Ces articles n’ont et n’auront rien de bien original par rapport à ce que l’on peut glaner de ci de là sur Internet, mais ils pourront me ou vous servir d’aide mémoire ou de piqûre de rappel !

Validation et filtrage des entrées

Un maître mot : « Ne jamais faire confiance aux données étrangères » !
Chaque donnée reçue doit être validée pour s’assurer qu’elle corresponde à ce que l’on attend réellement.

En PHP il existe de très nombreux outils de validation des données :

  1. Les opérateur de comparaison, de taille (chaînes, tableaux),…
  2. L’utilisation de liste de valeurs autorisées (« white-list ») : isset($hash[$var]) ... in_array($var, $allowed)
  3. À l’aide d’expression régulières : preg_match(‘/…/’ , $var);
  4. Extension ctype : ictype_digit($var); qui va vérifier que $var ne contient que des chiffres
  5. Les fonctions is_* : is_scalar($var);
  6. Depuis l’extension PHP 5.2, l’utilisation de l’extension Filter est recommandée.
    Exemple d’utilisation  :

    1
    2
    
    $clean['param1'] = filter_input(INPUT_POST, 'param1', FILTER_VALIDATE_BOOLEAN);
    $clean['email'] = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
  7. Pour Zend l’utilisation des classes Zend_Validate_* ainsi que la création de vos propres validateurs.

Ces validations doivent s’appliquer sur les données reçues par : $_GET, $_POST, $_REQUEST, $_COOKIES, $_FILES et certaines en provenance de $_SERVER ($_SERVER['PHP_SELF'] par exemple.

Échappement des sorties

Une fois vos données validées, il reste à échapper les sorties afin d’éviter les attaques XSS (Cross-site scripting) : détournement de formulaires, modification de l’affichage, vols de cookies, de sessions, etc.

De même que pour la validation des données PHP contient tout le nécessaire pour effectuer ces opérations :

  • Protéger les caractères sensibles : htmlspecialchars($var);
  • Protéger tous les caractères : htmlentities($var,...) et mb_htmlentities($var,...). Le deuxième paramètre, ENT_COMPAT|ENT_QUOTES|ENT_NOQUOTES est parfois important.
  • Enlever les balises HTML : striptags($text);
  • Encodage spécique pour URL : urlencode($var);
  • L’extension Filter peut non seulement valider comme vu au-dessus, mais aussi filtrer en sortie avec FILTER_SANITIZE_*
  • Pour Zend l’utilisation des classes Zend_Filter_* est tout aussi aisée, avec la possibilité de créer ses propres filtres suivant ses besoins

Attention au jeu de caractères, en particulier pour htmlentities() : problème d’affichage, voire de sécurité.
Pour les charsets multi-octets (comme UTF-8), mb_htmlentities() est plus fiable.

Protection des formulaires

S’assurer que les champs cachés ne sont pas modifiés

Pour cela il suffit d’envoyer en parallèle un hash contrôlant la valeur du champ caché.

1
2
3
4
5
6
<?php $idhash = md5($id . SALT); ?>
<form action="edit.php" method="POST">
<input type="hidden" name="id" value="<?php echo $id ?>" />
<input type="hidden" name="idhash" value="<?php echo $idhash ?>" />
<input type="submit" value="Valider" />
</form>

Et à la réception des données, vérifier que le hash correspont bien à la valeur attendue :

1
2
3
4
5
$id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
$idhash = filter_input(INPUT_POST, 'idhash', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if ($idhash !== md5($id . SALT) {
die('Le formulaire est louche ! ' );
}

Se prémunir des CSRF (Cross-Site Request Forgery)

Les attaques CSRF consistent à faire exécuter des commandes involontaires aux utilisateurs accrédités d’un site.

Quelques astuces pour s’en prémunir ou au moins en limiter grandement la portée, certaines évidentes et facile à mettre en place, d’autres plus subtiles…

Demander des confirmations à l’utilisateur pour les actions critiques

Par exemple systématiquement demander une confirmation du style « Êtes vous certain de vouloir … » sur des actions sensibles comme la suppression, ou redemander de saisir le mot de passe lors de la modification de la configuration de votre site internet.

Utiliser des jetons de validité dans les formulaires

Le principe est simple : lorsqu’un utilisateur affiche un formulaire, on lui génère une clé. Cette clé sera valide pour un certain temps (quelques minutes, le temps de remplir le formulaire), et est liée uniquement au couple utilisateur/formulaire. Cette clé devra automatiquement être transmise avec le formulaire pour que celui ci puisse être validé !

Dans le framework Zend il existe un élément de formulaire dédié à cet usage : Zend_Form_Element_Hash, son utilisation est aisée :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Mon_Formulaire_anti_csrf extends Zend_Form {
  public function init() {
    $this->setMethod('post');
    $this->addElement( 'submit'
                     , 'submit'
                     , array( 'ignore'   => true
                     , 'label'    => 'Soumettre'
                     ,)
                     );
    $form->addElement( 'hash'
                       , 'no_csrf'
                       , array( 'salt' => 'unique')
                       ); 
}

Le hash généré est stocké en session et sera ajouté à la chaîne de validation du formulaire : s’il est différent de celui stocké, il y aura une erreur d’émise.

Éviter d’utiliser des requêtes HTTP GET pour effectuer des actions

Passer systématiquement par POST pour toutes les actions autres que celles de consultation de ressource : insertion, mise à jour ou suppression de données.
Cette mesure va vous prémunir des attaques simples basées sur les images, mais pas de requêtes HTTP POST forgée en JavaScript par exemple.

Quelques liens pour aller plus loin :

  1. http://fr.wikipedia.org/wiki/Cross-site_request_forgery
  2. Zend_Form_Element_Hash
  3. http://bigornot-fr.blogspot.com/2008/07/csrf-sea-surf-and-zend.html
  4. http://truffo.fr/2010/03/les-filtres-php/
  5. http://zendframework.com/manual/fr/zend.filter.html
  6. http://zendframework.com/manual/fr/zend.validate.html
  7. Extension Filter
Catégories
Trucs et astuces

Hugin – logiciel d’assemblage de panorama

La problématique :

Piètre photographe, un appareil numérique qui ne veut plus faire de photos nettes depuis une baignade forcée, pas de pied pour effectuer un panoramique : voilà le tableau est peint !

Mais voilà arrivé au col du Veyre au-dessus des Lacs de Crupillouse, j’ai tenté d’effectuer un diaporama à la main.

De retour à la maison, j’ai bien tenté de réunir et réassembler les photos, mais le résultat n’était pas fameux, jugez plutôt :

Assemblage barbare à la main

J’ai laissé tombé jusqu’à tomber sur Hugin, logiciel open source (GPL) permettant à des béotiens comme moi d’assembler facilement plusieurs photos ensemble pour recomposer um panorama.

Les données − 4 photos de départ :

Utilisation du logiciel hugin

Hugin est un logiciel d’assemblage de panorama et bien plus encore.

Le logiciel fonctionne de manière très intuitive, on « lie » les photos les unes au autres en faisant correspondre quelques points remarquables.

Exemple de points ramarquables entre deux photos

Une fois toutes les photos rattachées il suffit de générer l’image finale, de vérifier, d’éventuellement reprendre quelques points… et d’admirer !

L'assemblage réalisé avec Hugin

Le logiciel est bourré d’options qui permettent sans doute d’améliorer le rendu, mais je n’ai pas pris le temps de jouer avec, le résultat suffisait à mon bonheur !

La page des tutoriaux : http://hugin.sourceforge.net/tutorials/index.shtml

Quelques mots sur les lacs de Crupillouse :


Les lacs surplombent la vallée de Champoléon dans les Hautes-Alpes. On y accède par un excellent sentier muletier serpentant dans les barres rocheuses.
La balade est longue (4 heures environ) mais le chemin n’est jamais difficile et le paysage est saisissant et les lacs valent vraiment le détour.

En cours de chemin on peut − avec un peu de chance − apercevoir des chamois dans les parois de la seconde partie de la randonnée.

Catégories
Linux MySQL Programmation Trucs et astuces

Utilisation de mysqlsniffer

But et utilité :

Pour pouvoir − en temps réel − visualiser et analyser et/ou capturer les requêtes effectuées sur un serveur ce petit logiciel est quasiment indispensable.
Il permet d’afficher en détails les requêtes effectuées, les résultats de ces dernières,…

Il est disponible sur le site : http://hackmysql.com/mysqlsniffer

Installation :

Sous Debian, il faut au préalable installer libpcap-dev : aptitude install libpcap-dev.
Puis :

  1. mkdir mysqlsniffer
  2. cd mysqlsniffer
  3. wget http://hackmysql.com/code/mysqlsniffer.tgz
  4. tar zxvf mysqlsniffer.tgz
  5. gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c

Utilisation :

Attention ! La connexion à « écouter » doit se faire en TCP, il faut mettre 127.0.0.1 au lieu de localhost dans la configuration du client pour avoir un résultat !

Ensuite il suffit de lancer la commande mysqlsniffer et de lire le résultat dans la console ou le stocker dans un fichier pour une analyse ultérieure.

Exemple de dump :

Une simple requête (SELECT) qui récupère des préférences :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1.47254 > server: ID 0 len 26 COM_QUERY: SELECT * FROM preferences
server > 127.0.0.1.47254: ID 1 len 1 6 FIELDS
        ID 2 len 76 FIELD: preferences.categorie <TYPE var string (509) SIZE 50>
        ID 3 len 66 FIELD: preferences.type <TYPE var string (509) SIZE 50>
        ID 4 len 62 FIELD: preferences.id <TYPE var string (1021) SIZE 255>
        ID 5 len 82 FIELD: preferences.defaultvalue <TYPE BLOB (4604) SIZE 65535>
        ID 6 len 68 FIELD: preferences.label <TYPE var string (509) SIZE 255>
        ID 7 len 80 FIELD: preferences.description <TYPE BLOB (4604) SIZE 65535>
        ID 8 len 5 END <warnings 0>
        ID 9 len 119 || diagnostic | text | departement_favori | 57 | Département par défaut | Doit être un des départements français (format numérique) ||
        ID 10 len 49 || synchro | text | login | XXX | Votre compte utilisateur |  ||
        ID 11 len 61 || divers | text | nb_clients_par_page | 30 | Nombre de clients listés |  || 
        ID 12 len 61 || divers | text | nb_projets_par_page | 30 | Nombre de projets listés |  ||
        ID 13 len 48 || synchro | String | password | XXX | Votre mot de passe |  ||
        ID 14 len 66 || diagnostic | text | rapport_pcs_2_m3 | 10.6 | Taux de conversion PCS->M3 |  ||
        ID 15 len 60 || synchro | text | sapid | xxx | Votre identifiant de compte (SAPID) |  ||
        ID 16 len 5 END <warnings 0>

Une autre façon de récupérer toutes les requêtes exécutées sur le serveur en écoute : TCPDUMP

Cette méthode ne permet pas de récupérer les infos complètes

1
2
3
4
5
6
7
8
9
tcpdump -i lo -s 0 -l -w - dst port 3306 | strings | perl -e '
while(&lt;&gt;) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|SHOW)/i) {
if (defined $q) { print "$q\n"; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=" $_";
}
}'

On peut trouver de nombreux autres outils pour MYSQL sur le site : http://hackmysql.com/tools avec notamment mysqlreport

Catégories
Trucs et astuces

Mozilla Weave – Intérêt et mise en place

Mozilla Weave kezaco ?

Il s’agit de la solution de Mozilla qui permet de partager entre plusieurs versions de Firefox un même profil (historique de navigation, marque-pages, mots de passe,…)

Il s’utilise de deux façons différentes :

  1. stockage des informations sur un serveur hébergé chez la Fondation Mozilla.
  2. Ou sur un serveur que vous auriez monté vous même

A la vue des informations stockées, c’est le second type de configuration que je trouve la plus intéressante.