Archives par mot-clé : php

Php: éviter les injections tout en préservant l’intégrité des données

Re bijour ^^

Encore une astuce à haute valeur philosophique …

Rapide rappel :

Pour éviter les SQL injections … la plupart du temps on fait appel à des addslashes, mysql_real_escape et … qui peuvent s’avérer dangeureuse suivant qu’on utilise du PHP5 ou PHP4 (et encore … la plupart du temps, il faut regarder les sous-sous version), alors il faut faire des fonctions qui teste tout et n’importe quoi … mais on est jamais sûr que sur tel ou tel serveur le script est sécurisé …

Alors voici une rapide astuce qui permet d’assurer la sécurité et l’intégrité des données (qui peut fonctionner tant que l’on ne fait pas d’insertion ^^).

Utiliser du md5!!! ou un autre type de chiffrage via crypt, … qui vous permettront de préserver l’intégrité des données transportées tout en ne portant pas préjudice au serveur SQL.

Exemple lors du login d’une personne, la requête associée pourrait être :

mysql_query(« select * from utilisateurs where login=' ».mysql_real_escape($_POST[‘login’]). »‘; »);

donc si un jour on transfert ce code sur un serveur ayant php 4.2 … le script ne marche plus ^^ (d’accord … qui irait passer de php5 à php 4.2 -> c’est pour l’exemple).

Par contre avec ce code :

mysql_query(« select * from utilisateurs where MD5(login)=' ».md5($_POST[‘login’]). »‘; »);

aucun problème … ^^ et vous êtes sûr que si ça renvoie une ligne ça soit la bonne ;).

Bon comme dit dans l’introduction, il faut quand même insérer des données (et ouai ça arrive parfois :p), et là … ça ne marcherait plus trop à part si vous êtes billingue français/md5.

A propos de billinguisme français/md5, y’a un superbe logiciel qui permet de craquer du md5 de façon sympa et très rapide les md5 (md5brute : http://www.tuxemu.se.nu/)

Typage et PHP ou comment remettre en cause l’univers ^^

Bijour à tous …

La blague PHP du jour :), testez ce code … vous pourrez être surpris 🙂
[sourcecode language= »php »]$var1= »lol »;
$var2=0;
if( $var1 == true and $var2 == false and $var1 == $var2 )
echo « hum hum, ça bug »;[/sourcecode]
Petite explication :

  1. $var1 est égale à vrai, car une chaîne de caractère non-vide est « vrai »
  2. $var2 besoin d’une explication ?
  3. Lorsque l’on compare une chaîne de caractère à un entier, celui-ci est égale à zéro lorsqu’il ne contient pas de chiffre …

Bloquer les visiteurs de votre site web utilisant tor

Bonjour à tous …

Rapide astuce pour bloquer l’accès à votre site web depuis un réseaux Tor :

Il suffit de mettre le code suivant au début de vos page php (header ou autre).

A noter qu’il faudrait peut-être tester aussi les port 9001 (autre port de tor) et le port 8118 (le port de privoxy)
[sourcecode language= »php »]if(@fsockopen($_SERVER[‘REMOTE_ADDR’], »9050″,$err1,$err2,0.5))
{
die(« Vous n’êtes pas autorisé à accéder à ce site web via le réseau Tor. »);
}[/sourcecode]
Ce qui aura pour effet de bloquer l’accès au site en affichant le superbe message dans le die().

Mais pourquoi bloquer l’accès au visiteur utilisant le réseaux tor ? Tous simplement parce que des hackers s’éclatent à scanner des sites web (via acunetix ou autre) pour trouver des failles … en utilisant le réseau tor pour masquer leurs ip et ainsi agir en toute impunité.

Pour aller plus loin …

Si vous êtes futé … vous aurez remarqué qu’ici on test le port 9050 du client (le port de tor), l’on pourrait bien sùr créer un tableau pour bloquer l’accès au client ayant le port 8080 (proxy http) ouvert, ou bien d’autre ports réputés être le port d’un proxy ^^.

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 … ++

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 😉