Archives pour la catégorie php

Se monter un environnement de developpement LAMP rapidement

Bonjour à tous et bonne fêtes de fin d’années …

Rapidement, le thème du jour : se monter un environnement de développement LAMP (pour dev en PHP ou …) proprement, avec une config DNS qui claque sa race ^^, juste histoire de revoir les « basiques » des serveurs DNS et d’un serveur apache.

L’idée étant que l’on ai des sous-domaines par projet du genre :

http://projet1.monpc.lan ou http://projet2.monpc.lan

Généré de façon dynamique, sans avoir à toucher à la config de son serveur à chaque nouveau projet, histoire de développer de façon rapide et propre, au lieu de tous stocker à la barbare pour accéder à ses sites en développement via http://localhost/projet1/module2/fichier3.php ou des urls à rallonge … Quoique l’on déporte le contenu du premier / au sous-domaine, mais bon, faut avouer qu’accéder à son site via http://localhost/projet au lieu de http://projet.monsite.org c’est moins sexy!!

(L’idée étant repiqué de mon environnement de travail chez advisa, que j’ai adopté pour développer mes projets perso,et aussi histoire de faire croire que j’ai le net dans le train).

Donc voilà … sous un système debian, on installe apache2, le module PHP, une base de données mysql, le serveur de NDD Bind9, ce qui donne la commande :

apt-get install phpmyadmin mysql-server bind9

Les dépendances de phpmyadmin étant le serveur apache et … ça raccourci pas mal la commande ;).

Pour ma part, je veux accéder à mon environnement de dev sur le nom de domaine : portable.lan, je modifie donc le fichier /etc/bind/named.conf pour rajouter :

zone « portable.lan » {
type master;
file « /etc/bind/db.portable.lan »;
};

avant la ligne contenant : include « /etc/bind/named.conf.local »;

et je créer le fichier /etc/bind/db.portable.lan contenant ce qui suit :

$TTL 3h
@       IN      SOA     ns.portable.lan. hostmaster.portable.lan. (
2005090201
8H
2H
1W
1D )

@       IN      NS      ns.portable.lan.

A       127.0.0.1
ns              A       127.0.0.1
*.portable.lan. IN      A       127.0.0.1

Qui aura pour effet de rediriger toutes les requêtes DNS à destination de portable.lan (www.portable.lan, …) à l’adresse IP 127.0.0.1, mais pour utiliser ce serveur de nom, il faut tout d’abort recharger la zone DNS :

/etc/init.d/bind9 reload

et modifier le fichier /etc/resolv.conf et rajouter ce qui suit :

nameserver 127.0.0.1

et malheureusement là … ce fichier est réécrit à chaque redémarrage, il faut donc modifier le fichier /etc/dhcp3/dhclient.conf et dé-commenter la ligne (en enlevant le # devant) :

prepend domain-name-servers 127.0.0.1;

qui aura pour effet de rajouter le serveur DNS 127.0.0.1 à chaque démarrage de la machine.

Maintenant, il faut configurer le serveur apache, très rapidement, on fait un :

a2enmod vhost_alias

pour rajouter le mod vhost_alias. Puis on modifie le fichier /etc/apache2/sites-enabled/000-default en changeant la ligne :

DocumentRoot /var/www

par :

VirtualDocumentRoot /var/www/%1

qui permettra, lorsque l’on se connecte à http://projet1.portable.lan d’utiliser le répertoire /var/www/projet1comme répertoire par défaut, par contre, il ne faut pas oublier de créer le répertoire www et portable, car si l’on tente de se connecter à http://www.portable.lan, le serveur apache cherchera le dossier /var/www/www ou pour http://portable.lan de chercher le dossier /var/www/portable … logique ^^.

et enfin, on redémarre le serveur apache :

/etc/init.d/apache2 restart

Voilà … c’est terminé ;), par contre, vous remarquerez que pour se connecter à phpmyadmin, on ne doit pas faire http://phpmyadmin.portable.lan, mais bien http://portable.lan/phpmyadmin, pourquoi??

Dans la config d’apache, il on généré un <Location> lors de l’installation, à la place d’un simple dossier dans le dossier /var/www, ce qui a pour effet d’ignorer notre superbe configuration, si ça vous dérange, vous pouvez créer un lien symbolique vers le dossier de phpmyadmin (/usr/share si mes souvenirs sont bon) depuis /var/www.

Voilà … c’était votre cadeaux de noël 😉

Mon dépôt SVN de sources inutiles

Bijour à vous en ce Dimanche ensoleillé … ou pas.

J’ai pas grand chose d’intéressant à poster aujourd’hui, sinon, l’ouverture de mon dépôt SVN (sous licence MIT, car je repique du GPL et avec la baisse du prix du Gazole ^^ … sinon, la licence wtfpl m’aurait bien plu, mais google n’a pas l’air de la proposer) avec :

  • Les sources PHP du script de SMS Alert (de macsim, réécrit pour se passer de Curl) du service de google calendar (qui ne marche plus parce google l’a bloqué :-s bande de *$!#@).
  • Ma classe http (qui permet de se passer de la librairie Curl).
  • Les sources PHP du script msn.class.php de Tommy Wu pour ne plus utiliser Curl … encore ^^. (le script est compatible MSNP9 et 15, mais le 15 à encore besoin de Curl … utiliser Curl pour du SOAP parce que M$ ne fournit pas de WSDL … faut le faire !! Bande de N00b).
  • Et surement plein d’autre trucs inutile à venir.

Et ouai … j’ai pas fait grand chose d’intéressant ce week-end.

Sinon, quelques liens intéresant :

Un lien qui recense pas mal de failles qu’il est possible d’exploiter en PHP (ex : bypass du safe-mode en 5.1, …).

Un fournisseur de certificats personnels gratuit et super rapide (à cause d’un TP de système sur la sécurité des réseaux, pour lequel il nous fallait un certificat X509).

Envoyer des sms via google calendar et php … socket party ^^

Bonsoir à tous …

Chose promise, chose due … (avec un peu de retard ^^). Mais qu’est-ce que j’avais promis ??

Une version en socket du fameux système permettant d’envoyer des sms via google calendar … qui malheureusement pour le moment avait besoin de la librairie CURL … qui n’est pas installé chez tous les hébergeurs.

Les fonctionnalités sont globalement les mêmes que la version CURL :

  • Ajout d’un évènement dans google calendar (dans les 5 minutes).
  • Envoi d’un sms dans les 5 secondes qui suivent l’exécution du script.

Ma version fonctionne mais connait quelques bugs :

  • un bad request en fin d’envoi (j’utilise un fsockopen sur un flux ssl, et google me fait une redirection sur un flux « non-sslisé » en fin d’action, ce qui donne logiquement un retour en 400).
  • L’utilisation un peu bof (faudrait éclaircir le code, dispatcher le tout dans différents fichier, histoire d’organiser la bête et peut-être prévoir un module en CLI).

Le lien de téléchargement : sockhttpphp

Bien sûr, ne vous attendez à pouvoir envoyer des sms à tous le monde … c’est seulement pour vous envoyer des mails (genre lorsque votre serveur redémarre, que quelqu’un poste un commentaire sur votre blog, …).

Fork et PHP utile ??

Bonsoir …

Alors voilà … thème de la soirée les forks et PHP

On lit souvent sur les forums que les forks en PHP servent strictement à rien et tous le … et je dois avouer que de la prog système en PHP, c’est vraiment bof bof.

Mais cette semaine, pour le développement de mon application de gestion de NewsLetter (pour mon apprentissage), on m’a obligé à faire des forks et autre astuces système pour optimiser un peu la bête ^^.

Au départ, j’étais plutôt septique, je trouvais ça même louche … j’avais même jamais entendu parler de fork sur PHP, mais au final, j’étais plutôt surpris du résultat …

Pour exemple : Un script doit envoyer 60 mails.

Une appli en single :

[sourcecode language= »php »]
for($i=0;$i<60;$i++) { mail($mail_a[$i],"sujet","message"); } [/sourcecode]

Une appli (en « multi thread ») :
[sourcecode language= »php »]
for($i=0;$i<60;$i++) { $pid = pcntl_fork(); if ($pid == -1) { die('dupplication impossible'); } else if ($pid) { $pid_a[] = $pid; //juste au cas où } else { mail($mail_a[$i],"sujet","message"); } } pcntl_waitpid ( 0 , $status); // on attend la mort de tous ses fils ... c'est cruel [/sourcecode] Si vous chronométrez le temps que ces deux scripts prennent, l'on remarque la rapidité du fork ... Lorsque j'ai testé le code (sur le serveur de ma boite), le premier mettait presque 30 sec pour envoyer les 60 mails (et encore, je les recevais pas tous), dans le deuxième cas, c'était instantanné, la plupart des threads ce terminaient dans la seconde. Donc voilà ... ne jamais dire que de la prog système dans le web ça sert à rien ;-), je go tenter de faire un site avec des signaux et des sémaphores :-d.

Système d’alerte via SMS sur vos serveurs grace à google calendar.

Bijour à tous …

Aujourd’hui, juste un lien vers le blog de macsim, (pour ceux qui ne l’aurait pas dans leurs RSS), qui à pondu un superbe script (PHP) pour utiliser le système d’évenement de Google Calendar, pour envoyer des SMS (et ajouter l’évenement dans Google Calendar), lors de diverses actions sur vos serveurs …

Pour l’installer il vous faut PHP-Cli, ainsi que l’extension Curl de PHP. (J’ai fait le tour du code … ça à l’air sérieux …, sauf peut-être l’utilisation de Curl … utiliser des Sockets, aurait permit de sauter cette extension, qui n’est pas installé chez tous les hébergeurs …).

J’vais peut être tenter d’améliorer le truc en faisant un plugins pour WordPress pour recevoir des SMS lorsque des commentaires sont postés ^^. (J’ai plus de commentaire indésirable que de réelle commentaire … donc ça ne sera surement pas utile ^^, mais pour le fun …).

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 …

TPLN : un moteur de template

Bonjour …

Bon je suis si bien lancé aujourd’hui :).

Donc voilà … je vais rapidement parler d’un moteur de template, alors tous d’abord, ça sert à quoi? Ben jusqu’à maintenant, je codais mes sites comme un porc :

  1. Je récuperais un kit graphique sur le net
  2. Je découpais le site : un header, la partie des articles, et le footer
  3. Je programmais le site via des fonctions qui modifiait la partie article et …

Grâce aux templates maintenant, je fait des trucs un peu plus propre, qui permettent non seulement de respecter les standards plus facilement, car qu’en on a un fichier html répartie sur plusieurs page, on oublie souvent de fermer des balises … adieu les standards.

Donc maintenant, gràce à TPLN je fait :

  1. Récupération du kit graphique
  2. Remplacement des éléments texte par balises propre au moteur de template
  3. Programmation du site.

Ok ça n’a rien changé au niveau des étapes, mais avec la deuxième méthode, on passe plus rapidement à la partie programmation du site, (et comme j’aime pas trop le grahisme, autant passer dessus rapidement).

Donc voilà … je vais faire un peu la « promotion » de TPLN pour plusieurs choses :

  1. TPLN ne s’occupe pas seulement de la mise en page, il peut aussi chercher directement des choses ^^ dans la base de données, permettre un affichage automatique de liens vers des pages, …
  2. Permet une bonne interaction avec ajax 🙂
  3. Plein d’autre chose encore (génération de flux rss, …)

C’est sûr les puristes qui veulent juste un moteur de template vont plutôt se tourner vers smarty et … mais bon je vois pas trop l’intêret de créer toute une page php pour gérer des pages qui ne font qu’afficher directement le contenu d’une base de donnée :

Pour l’exemple : le template, le fichier php (désolé mais wordpress n’aime pas les codes source php et html)

Avoué que c’est plutôt court non? et pis ça facilite pas mal le développement, le developpeur modifie le .php, et le graphiste modifie seulement le .html (c’est le but d’un moteur de template oui :)). Mais dans ce cas, le dev écrit beaucoup moins de code qu’avec un autre moteur de template.

Si ça vous intéresse :

L’ensemble des exemples

Pour télécharger les sources

La doc

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