Archives pour la catégorie Programmation

Tous ce qui à attrait la programmation ^^

Se protéger contre la failles CSRF

Bonjour,

Avec la technologie ajax, les failles CSRF commencent à fleurirent sur internet. Mais qu’est-ce que la faille CSRF ?

Un petit tour sur Wikipedia suffit, ça signifie : Cross-Site Request Forgeries, en fait, il s’agit d’une technique très simple de hacking, qui consiste à rediriger une personne (de préférence un administrateur), sur son site avec des requêtes (en GET ou en POST cf. Protocole HTTP) susceptible de porter atteinte au contenu du site web.

Exemple :

Soit le Pigeon P, administrateur d’un site web dans lequel l’url suivante : http://p-site/post.php?titre=titre&art=article permet l’ajout d’un article avec le titre et le contenu de l’article (exemple stupide).

Imaginons, que P fréquente souvent un forum F, et qu’un Hacker H le sache, il suffit à H de mettre le code suivant comme avatar : http://p-site/post.php?titre=Owned&art=hacked, générant donc sur le forum F, le code suivant : <img src= »http://p-site/post.php?titre=Owned&art=hacked » />, lorsque P regardera le post du hacker H, son navigateur cherchera l’image du lien, et executera l’ajout de l’article (si P était encore authentifié sur son site bien sûr …).

Vous aurez donc très vite compris l’interêt de ce déconnecter d’un site web, d’un forum ou d’un blog tous de suite après avoir effectué vos actions courante …

Bien entendu ce protéger de ce genre d’attaque peut être mieux que de ce déconnecter à chaque fois, d’autant plus que parfois, ça arrive, on oublie de ce déconnecter.

Une technique de protection pour une requête de type POST peut-être la suivante :

$url_de_votre_site="http://www.php-engineering.info/";
if($_SERVER['REQUEST_METHOD']=="POST" AND
!preg_match("#^".$url_de_votre_site."#i",$_SERVER['HTTP_REFERER']))
{
echo "Tentative de CSRF sur un formulaire";
exit;
}
?>

Une technique de protection pour une requête de type GET peut-être la suivante :

$url_de_votre_site="http://www.php-engineering.info/";

//les fichiers auquels on ne peut accéder directement via un autre site
$tab_fichier_interdit[]="edit.php";
$tab_fichier_interdit[]="supprime.php";

if($_SERVER['REQUEST_METHOD']=="GET" AND
!preg_match("#^".$url_de_votre_site."#i",$_SERVER['HTTP_REFERER']))
{
$f=substr($_SERVER['REQUEST_URI'],0,strrpos($_SERVER['REQUEST_URI'],"?"));
//on enlève ce qui est après le ?
$f=substr($f,strrpos($f,"/")+1,strlen($f));
//on isole le nom du fichier

//et on regarde si c'est un fichier qui ne doit pas être accéder
//directement depuis un autre site web
if(in_array($f,$tab_fichier_interdit))
{
echo "Tentative de CSRF sur une url";
exit;
}
}

Bon, bien sûr, il existe d’autre technique, comme mettre un captcha.

Mais pourquoi ai-je critiqué l’ajax ?

Tous simplement, parce que la plupart du temps les développeurs ajax, préfère utiliser du get que du post … aller savoir pourquoi (avec scriptaculous, que ce soit en GET ou en POST c’est presque la même chose).

A noter que par exemple gmail n’utilise que du get dans son système de mail … il paraitrait que des hackers se sont pas mal amusé avec, et qu’il existerait encore des failles … penser à vous déconnecter.

PHP … ^^

Bijour à tous … encore une fois (n’est pas coutume …) je parle de PHP, en effet, je suis tombé sur un superbe blog (et non c’était pas le mien ^^), qui regroupe quelque classes en PHP qui peuvent être utiles :

le lien vers le blog

Entre autre classes intéressantes :

Pour en rajouter quelques autres intéressant qui n’ont pas été malheureusement posté sur ce blog, qui semblet-il fait fureur chez les dev’s PHP :

  • xdebug qui permet de debugger des scripts PHP, avec des « backtraces » assez sympa … c’est pas réellement une classe … mais c’est classe quand même ^^, a noter que d’autre outils sont inclus dans php pour faire des choses similaires comme APC : http://fr2.php.net/apc
  • xajax ^^ qui permet de créer et d’utiliser des scripts Ajax via PHP

ça fait déjà trop de PHP ici … ++

La RC de Firefox bientot dans les depots d’hardy

Allez hop …

La RC sera dans les dépots bientot ^^ (source planet.ubuntu-fr.org), en attendant que les dev de plugins porte leurs sympatique appli pour la version 3, voici une extension qui pourrait être très utile dans les prochain mois : http://www.oxymoronical.com/

C’est une extension pour forcer la compatibilité des anciennes extension avec Firefox 3 …

Cela dit, il est peut-être préférable de d’attendre les mise à jour officiel 😉 Car certaine fonction ont été supprimé, ou bien certaine extension qui utilisait des « hacks » ont été bloqué, … Donc voila ^^

Bon sinon, pour faire tourner firebug (la meilleur extension pour les dev web et les hackers ?? ^^) sur firefox3 (c’est la version beta qui marche très mal mais qui rajoute quelque petit truc sympa).

Améliorer le référencement grace aux php

Bon … mon standing oblige xD ce soir : référencement et PHP (une fois n’est pas coutume).

Alors bon … vous aurez surement remarqué que bon l’url rewriting c’est bien … mais souvent des sites utilisant des urls bizzare sont mieux référencés … allez savoir pourquoi xD.

En vrai, ils font souvent appel au PATH_INFO … hein?!

en vrai c’est ce qui se trouve dérrière le nom de domaine :

http://loser-php/index.php/mon/site/rox/autant/que/mon/seo

Le PATH_INFO contient « /index.php/mon/site/rox/autant/que/mon/seo« , ça sert à quoi me direz-vous … hé ben vous remarquez une première chose : pas de ? et de = caractères que certain moteur de recherche n’affectionne que moyennement, ensuite le séparateur est un / et pourquoi c’est mieux qu’autre chose (-,.) ???

Tout simplement car un moteur de recherche est obligé de prendre en compte les / alors que la compréhension des -,. et autre signe peut être différentes suivant les moteurs de recherche. (Je viens de vous apprendre qu’il y a d’autre moteur de recherche ??? Non :p)

Sachant que le nom du dossier contenant le fichier sur lequel on fait référence à a peu près le même poids (parfois plus ^^), que le fichier en question, il peut être donc très avantageux dans certain cas d’avoir dev son site en utilisant le path_info. D’autant plus qu’une url en path_info peut être plus facile à retenir qu’une url rewrité …. (http://php-loser/index-9-1-7-mon_super-titre, de-la-mort-ki-tu-pas-sa-race.html ou bien http://php-loser/index.php/mon /super/titre/qui/defonce/la/concurrence/). Et oui … on peut parfois confondre le _ avec -, et … donc en path_info, on sait qu’il y a toujours des / donc ^^

Donc voila un simple exemple :

$path_info=$_SERVER['PATH_INFO']; //on récupère le path_info
$path_info_explode=explode("/",$path_info);

//  et ensuite on recupère les élements dans le tableau ...
//  si l'on reprend l'url :
//  http://php-loser/index.php/mon/super/titre /qui/defonce/la/concurrence/

echo $path_info_explode[1]; //ecrit mon, et oui le 0 faisant référence à l'index.php 🙂
echo $path_info_explode[7]; //ecrit concurrence.

bon … c’est sur, si vous utilisez une base de données, il faudra à chiffre tôt ou tard … le plus tôt étant le mieux, il suffirait de faire comme ceci :

http://php-loser/index.php/1/mon/titre

et de récupérer le chiffre par la méthode vu plus haut.

Bon c’était un rapide exemple … j’imagine qu’il n’en faut pas plus 😉

Netbeans6 et auto-complétion QT4

Bonjour …

La méthode de la version 5 ne marchant plus … Si l’on include direct QApplication ou d’autre ça ne marche pas si l’on fait référence seulement à /usr/include/qt4/ (méthode qui fonctionnait sur l’ancienne version …).

Donc je fait un rapide billet histoire de me souvenir de la manip’ (comme je programme pas souvent en C++)…

  1. Clic droit sur le nom du projet.
  2. Properties (propriétés) puis C++ compiler et choisir le dossier d’include …

et voilà, … ça tourne impec’ :p … il en faut peu pour être heureux 😉

(Bon l’alternative aurait été de faire un include de <QTGui/QApplication> … mais bon faudrait modifier pas mal de projet pour le prendre en compte alors ;)).

Netbeans 6.1 PHP et Cpp

Héhé … j’ai trouvé suite à l’un de mes précédent post comment installer proprement le plugin C++ sur un Early Access … c’est un tous petit peu plus propre …

Il suffit de rajouter cette url de mise à jour et de choisir le plugins C++

Et on peut aussi rajouter les autres histoire d’avoir un truc complet :

Lien 1 Lien2 Lien3

Je trouve dommage d’avoir séparé la version PHP du reste de l’IDE car en plus, l’ensemble des plugins proposés dans la Early Acess ne sont pas dispo, même dans la version Full … d’où l’expression alsacienne être « Full » (ne pas confondre pas avec le mot anglais ^^), à noter que l’alsacien ne s’écrivant pas … je sais pas comment ça s’écrit :d …

JavaFX … quelque liens utile

Je ne vais pas dire que je suis fan de java … mais bon javafx a du potentiel … d’autant plus que c’est plutôt bien géré par linux … déjà mieux que flex ou encore silverlight ^^.

Alors bon … quelque liens rapide : (histoire que je les ai sous la main le jour où j’en ai besoin ^^)

Le Wiki

La page de résumé

L’adresse de la doc

Le plugin de dev de javafx pour netbeans

La page de l’API

… A partir de la … on peut déjà faire pas mal. (rien qu’avec la doc de l’api…)

Ajax et infobulle

Ben voilà … nouvelle article sur l’ajax, une petite astuce pour notifier le visiteur d’événement survenue avec ajax. La plupart du temps en ajax on privilégie une zone sur l’écran, au centre, tout en haut, tout en bas.

J’expérimente depuis quelque temps déjà, une autre zone, qui est elle aussi assez souvent bien vue par l’utilisateur … a coté du pointeur de la souris :

Le pointeur de la souris est manquant … mais faut l’imaginer quoi :p

Donc voila le code :

Le CSS dont on a besoin :

#infobulle {
    background-color:white;
    border:1px solid #CCCCCC;
    font-family:Verdana,Arial;
    font-size:0.7em;
    padding:10px;
    position:fixed;
    visibility:hidden;
}

Le code Javascript :

var timeOUTaffBulle=null;
var bubble = document.getElementById("infobulle");
var cursor_padding = 5;
var nav = navigator.appName;
var ie = document.all;
var ns = document.layers;
if(!ie)
 document.captureEvents(Event.MOUSEMOVE);

document.onmousemove = get_mouse;

function get_mouse(e){
 if(ie){
 x = event.x;
 y = event.y;
 window.status = x;
 }else{
 x = e.pageX;
 y = e.pageY;
 }

 bubble = document.getElementById("infobulle");
 bubble.style.left = x + cursor_padding+'px';
 bubble.style.top = y - document.documentElement.scrollTop + cursor_padding+'px';
}

document.onmousemove = get_mouse;

// affiche la bubble
function see_bubble(text){
 bubble.style.visibility = "visible";
 bubble.style.display = "block";
 if(timeOUTaffBulle!=null)
 bubble.innerHTML+="
"+text;
 else
 bubble.innerHTML = text;
}

function affBulle(text)
{
 see_bubble(text)
 timeOUTaffBulle=setTimeout("kill_bubble()",1800)
}

function kill_bubble(){
 bubble.style.visibility = "hidden";
 bubble.style.display = "none";
 if(timeOUTaffBulle!=null)
 {
 clearTimeout(timeOUTaffBulle);
 timeOUTaffBulle=null;
 }
}
/*FIN INFOBULLE*/

Donc voila … il suffit juste de mettre une div avec comme id « infobulle » et d’appeler la fonction : affBulle(‘Salut à vous …’);
Pour afficher une superbe infobulle à côté de votre souris.

Gérer les accents en Ajax

Un rapide article sur la gestion des accents en Ajax, avec scriptaculous (bien entendu).

Rapide rappel :

Faire une requete en GET avec scriptaculous :

new Ajax.Request('url',
{
    asynchronous:true,
    onSuccess: function(e) {
        //le traitement
    }
});

Les requetes en POST avec scriptaculous :

new Ajax.Request('url',
{
    method:'post',
    postBody:'param1='+escape(document.getElementById('val1').value)+
    '&param2='+escape(document.getElementById('val2').value),
    asynchronous:true,
    onSuccess: function(e) {
        //traitement
    }
});

Et donc pour rajouter le support des accents, il faut rajouter l’option :

encoding: ‘iso-8859-1’

Faire une requete en GET avec les accents :

new Ajax.Request('url',
{
    asynchronous:true,
    encoding: 'iso-8859-1',
    onSuccess: function(e) {
        //le traitement
    }
});

Les requetes en POST avec les accents :

new Ajax.Request('url',
{
    method:'post',
    postBody:'param1='+escape(document.getElementById('val1').value)+
    '&param2='+escape(document.getElementById('val2').value)+
    asynchronous:true,
    encoding: 'iso-8859-1',
    onSuccess: function(e) {
        //traitement
    }
});

Et voilà, plus aucun problème avec les accents et autre caractères spéciaux. (En français bien sur).