Sahid Ferdjaoui Blog - Funraill Foundation Bienvenue, Log in - thème 2007 RC1

Powered by OpenSource Softwares

Outil de déboggage colaborative
reduire

Prechargement d’images en Javascript

le 19 août 2008 par sahid

Javascript, prechargement d’images (images loader)

Une fonction Javascript toute bete pour faire patienter vos visiteurs durant le chargement d’images un peu lourdes.

Exemple:

Source:

  1. preload = function (o, img_src, w, h) {
  2.   var img = new Image ();
  3.   img.onload = function () {
  4.     o.onload = null;
  5.     if (w) o.width  = w;
  6.     if (h) o.height = h;
  7.     o.src = img.src
  8.   };
  9.   img.src = img_src;
  10. }

Usage:

  1. <!– sans redimensionnement –>
  2. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg’)”/>
  3.  
  4. <!– avec redimensionnement homothetique sur la largeur –>
  5. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, 300′)”/>
  6.  
  7. <!– avec redimensionnement homothetique sur la hauteur –>
  8. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, null, 300′)”/>
  9.  
  10. <!– avec redimensionnement –>
  11. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, null, 300, 400′)”/>
reduire

Mettre en cache ses objets Javascript

le 22 juin 2008 par sahid

myStorage.js …ses requêtes Ajax en cache

Cette classe JS permet de mettre en cache les résultats de ses requêtes Ajax.
l’intérêt est d’éviter les requêtes inutiles au serveur d’application (et/ou de données). elle utilise le framework prototype.js

Dans une application full Ajax, ou un simple widget Ajax, il peut être intéressant de mettre le résultat de ses requêtes en cache. si on prend l’exemple de données extraites d’une base de données, l’intérêt est encore plus important, car cela évite de re taper la base de données à chaque évènement de l’utilisateur.
Le seul problème est qu’il est important de bien gérer la validité des informations mises en cache.

Mise en route

  1. <script type=“text/javascript” src=“prototype.js”></script>
  2. <script type=“text/javascript” src=“myStorage.js”></script>
  3. <script type=“text/javascript”>
  4.         window.onload = function () {
  5.           storage = new myStorage ();
  6.         }
  7. </script>

Un exemple rapide d’utilisateur avec Ajax.Request

  1. function loadData (id) {
  2.         var key = ‘item-’ + id;
  3.         var item;
  4.  
  5.         /** get data if exists */
  6.         if ((item = storage.get (key)) !== false) {
  7.           return item;
  8.         }
  9.  
  10.         new Ajax.Request (‘data.php?id=’ + id, {
  11.           onSuccess: function (xhr) {
  12.             var json = xhr.responseText.evalJSON ();
  13.             if (json.response && json.response == ‘OK’) {
  14.  
  15.               /** add data for 1 hour */
  16.               storage.set (key, json.data, 3600);
  17.               return json.data;
  18.             }
  19.           }
  20.         });
  21.       }

details sur la lib et téléchargement

reduire

Onglets dynamiques en Javascript/Ajax

le 11 juin 2007 par sahid

Petit script d’onglets dynamiques en Javascript/Ajax

Les onglets sont donc chargés dynamiquement via l’utilisation de XMLHttpRequest ().
Le script utilise window.onload afin d’intercepter les événements, ensuite via de simples conditions on redirige le traitement. Afin de rendre une impression d’onglet sélectionné, on change la classe de la balise li.

Les sources :

Compatibilité IE

Le script actuel n’est pas compatible IE, j’ai juste cherché à me lancer un petit défi rapide, il pourrait aussi sans doute etre amélioré (meme sur ( ; et c pour ca que les commentaires sont là !
Pour ceux qui souhaiteraient le rendre compatible IE, je vois plusieurs points à modifier

  • Au niveau des evenements, IE ne gere pas ca via un parametre sur la fonction, la variable est remplie en tant qu’attribut de la classe window. donc :

    1. document.onclick = function (ev) {
    2.   var ev = ev || window.event
    3.   var el = ev.etarget || ev.srcElement
    4. }
  • Je n’ai pas initialisé la classe XMLHttpRequest () pour IE, donc :

    1. function createXHR ()
    2. {
    3.   try { return new XMLHttpRequest (); } catch (e) {};
    4.   try { return new ActiveXObject (“Microsoft.XMLHTTP”); } catch (e) {};
    5.   try { return new ActiveXObject (“Msxml2.XMLHTTP”); } catch (e) {};
    6.   return null;
    7. }
  • Je vois que ca au premier coup d’oeil… m’enfin commentez si vous voyez quelques chose.
reduire

Drag en Javascript

le 20 mars 2007 par sahid

Faire bouger une fenetre en Javascript

Hier je me suis amusé à faire bouger une div en Javascrypt. Bon il n’y a rien de compliqué, ca peut etre interessant de faire partager ce petit bout de code. Le script actuel gere que une seule fenetre, mais ce qui peut etre interessant c d’utiliser pour le contenu, un chargement dynamique via l’objet XMLHttpRequest.

  1. // mouvement de la fenetre
  2. function drag (ev, o, x, y)
  3. {
  4.         var ev = ev || window.event;
  5.         document.onmousemove = function (ev) {
  6.                 o.style.cursor = “move”;
  7.                 o.style.left = ev.clientX +x;
  8.                 o.style.top = ev.clientY +y;
  9.         }
  10.         document.onmouseup = function (ev) {
  11.                 o.style.cursor = null;
  12.                 document.onmousemove = null;
  13.         }
  14. }

le code

reduire

PHP AJAX - HTTP Identification avec Cryptographie Asymétrique

le 4 novembre 2006 par sahid

Une identification PHP/AJAX utilisant la Cryptographie Asymétrique

Voila une maniÚre d’aborder AJAX, on va essayer de mettre au point un systÚme d’identification
des utilisateurs avec PHP/MySQL, mais aussi en utilisant
de l’AJAX histoire de rester dans le web 2.0 …de plus pour agrémenter un peu les choses on utilisera une technique de cryptographie asymetrique tiré de RSA, cela peut être utile si vous n’avez pas les moyens ou pas envie d’acquerir une clef ssh valide.

Identification PHP AJAX RSA

Principe de la Cryptographie Asymétrique

En gros, dans notre cas,
On a un mot de passe crypteé en MD5 en base de donnée. Le serveur génere une clef publique qu’il garde en session et l’envoi au client, cette clef sera le facteur commun entre le serveur et le client.
Notre client envoi la clef publique, le mot de passe haché une premiere fois avec l’algorithme MD5, et une deuxieme fois avec la clef publique.
Donc le serveur recoit un mot de passe haché avec la clef publique, et la clef publique, il n’a plus qu’a verifier que la clef publique envoyée est bien identique à la sienne gardeée en session, et recuperer le mot de passe crypté en MD5 de la base de donnée, le hacher avec la clef publique et verifier que les deux mots de passe (celui envoyé par le client haché avec la clef publique, et celui recuperé de la DB hacher avec la clef publique) correspondent.

Cahier des charges :

Soyons pro un cahier des charges peut etre interessant histoire de savoir ou on met les pieds.
Notre projet visera la simplicité, (…je ne suis pas reponsable si vous vous faites hacker !! lol …)

  • Tournera sur Firefox et Internet Explorer
  • Les utilisateur n’ayant pas activé JS pour X raisons, pourront quand meme se logger ( ou non … a vous de voir)
  • Une petite console, histoire de voir les échanges client serveur
  • je reflechis !

Prerequit :

On utilisera deux bibliotheques permettant un hash md5, une en Javascript et l’autre en PHP, elle sont dans l’archive.

C’est parti !

Je ne vais pas detailler pas à pas le projet, juste donner la methode … (je n’ai pas dis non plus que c’etait la meilleure !)
pourquoi ? … parce qu’au moment ou j’ecris ces lignes, j’ai faim … ensuite parce que je laisse les sources du projet,
puis faire des petites recherches personnelles c’est le mieux.

Le Client

Pour la partie client, en premier, on va initialiser une clef publique qui sera envoyée au serveur par l’intermediaire du formulaire

  1. $_SESSION[‘cle’] = uniqid(mt_rand(), true);          // génération d’une clé publique unique
  2.  

maintenant on va mettre en place un formulaire qui sera envoyé seulement apres avoir recu l’accord de la methode
javascript httpRequest(), qui, elle, acceptera l’envoi du formulaire seulement si l’utilisateur n’a pas activé Javascript, dans le cas
contraire, elle utilisera la methode HTTPRequestXML pour envoyer les informations du formulaire au serveur

  1. <form method=“POST” action=“serveur.php” id=“formCrypt” onsubmit=“return httpRequest()”>
  2.         <input type=“hidden” id=“js” name=“js” value=“0″/>
  3.         <label>
  4.                 <input type=“text” id=“cle” name=“cle” value=“<?=$_SESSION[’cle’]?/>" size="33" disabled/>
  5.                 Clef publique<br />
  6.         </label>
  7.         <label>
  8.                 <input type=”text” id=”username” name=”username” size=”33“/>
  9.                 Nom d’utilisateur<br />
  10.         </label>
  11.         <label>
  12.                 <input type=”password” id=”password” name=”password” size=”33“/>
  13.                 Mot de passe<br />
  14.         </label>
  15.         <input type=”submit” id=”submit” name=”submit” value=”Connexion S&eacute;curis&eacute;e“/>                 
  16. </form>

La methode httpRequest, est en fait celle qui va gérer les requêtes avec le serveur, seulenemt avant d’envoyer la requête,
on a besoin d’hacher le mot de passe avec la clef publique generée au préalable.

  1. function httpRequest() {
  2.         var request;
  3.         var p, u, c;
  4.  
  5.         // instance de l’objet pour la communication avec le serveur
  6.         if ( window.XMLHttpRequest ) {
  7.             request = new XMLHttpRequest();
  8.             request.overrideMimeType(‘text/xml’);       // force l’en-tete des reponses en XML
  9.         } else if ( window.ActiveXObject ) {
  10.             request = new ActiveXObject(“Microsoft.XMLHTTP”);
  11.         }
  12.  
  13.         // impossible d’utiliser AJAX
  14.         if (!request) {
  15.                 return true; // envoi du formulaire normal !
  16.         }
  17.        
  18.         // — Traitement des données du formulaire
  19.         u = $(‘username’);
  20.         p = $(‘password’);
  21.         c = $(‘cle’);
  22.        
  23.         // hachage du password avec la clef publique (le mdp est aussi haché en md5)
  24.         p.value = hex_hmac_md5(c.value, hex_md5(p.value));
  25.  
  26.         // — Traitement des reponses du serveur
  27.         request.onreadystatechange = function() { traitement(request) }
  28.  
  29.         request.open(‘POST’, ’serveur.php’, true);                                                      // préparation de la requête
  30.         request.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
  31.         request.send(‘username=’+u.value+‘&password=’+p.value+‘&cle=’+c.value+‘&js=1′);  // envoi de la requête
  32.        
  33.         return false; // évite l’envoi du formulaire
  34. }

Donc maintenant on est prêt a envoyer une requete au serveur avec un mot de passe crypté qui nous evitera ainsi de se faire sniffer par des
méchants pirates !; la methode traitement(), elle, reagit aux reponses du serveur

  1. function traitement( request ) {
  2.         // vérification de l’état de la requête ( 4 = terminée )
  3.         switch (request.readyState) {
  4.                 case 0 :                                                                                                // 0 non initialisé
  5.                         affiche(‘requ&ecirc;te non initialisée !’)
  6.                 break;
  7.                 case 1 :                                                                                                // en cours de chargement
  8.                         affiche(‘requ&ecirc;te en cours de chargement …’)
  9.                         onLoad();
  10.                 break;
  11.                 case 2 :                                                                                                // chargée
  12.                         affiche(‘requ&ecirc;te charg&eacute;e !’)
  13.                         offLoad();
  14.                 break;
  15.                 case 3 :                                                                                                // en cours d’interaction avec le serveur
  16.                         affiche(‘requ&ecirc;te en cours de d\’int&eacute;raction avec le serveur …’)
  17.                 break;
  18.                 case 4 :                                                                                                // terminée   
  19.                         affiche(‘requ&ecirc;te termin&eacute;e !’);
  20.                         if ( request.status == 200 ) {
  21.                                         reponse(request.responseXML);
  22.                         } else
  23.                                 affiche(‘Un probl&egrave;me est survenu avec la requ&ecirc;te’);
  24.                 break;
  25.         }
  26. }

Le serveur

Voyons un peu comment le serveur doit nous retourner les reponses,
Deja on veut de l’AJAX, donc elles nous seront retournées en XML, javascript manie plutot bien le DOM.

j’utilise une classe pour l’identification que je ne presenterai pas ici, elle sera dans les sources a telecharger

  1. // Javascript est actif, Traitement AJAX
  2. if ( $js === 1 ) {
  3.         $con = new Cryptographie($_SESSION[‘cle’]);
  4.        
  5.         usleep(800000)// simulation de délai en local
  6.        
  7.         $cle = $con->checkCle($_POST[‘cle’]);
  8.         if ( $cle ) {
  9.                 $db_mdp = $con->checkUsername($_POST[‘username’]);
  10.                 if ( $db_mdp !== false )
  11.                         $ok = $con->checkPassword($db_mdp, $_POST[‘password’]);
  12.         }
  13.                        
  14.         $erreurs = $con->erreurs;
  15.        
  16.         header(‘Content-type: text/xml’);
  17.         if ( count($erreurs) !== 0 ) {
  18.                 foreach ( $erreurs as $num => $erreur )
  19.                         echo ‘<xml><numero>’.$num.‘</numero><message>’.$erreur.‘</message></xml>’;
  20.         } else {
  21.                 //$_SESSION[’user’] = $_POST[’username’];       // - on ouvre une session, l’utilisateur est connecté !
  22.                 echo ‘<xml><numero>0</numero><message>CONNEXION_ACCEPTEE</message></xml>’;
  23.         }
  24. } else {
  25.         // traitement normal
  26.         echo ‘js n\’est pas actif !’;
  27. }

La console

Dans le cahier des charges on a parlé de créer une console afin de voir un peu comment reagit notre code …
ca sera en fait une simple fonction javascript qui nous permettra de sonder chaque partie du code que l’on souhaite.

  1. function affiche(msg) {
  2.         $(‘console’).innerHTML += “< ?=$_SERVER[’REMOTE_ADDR’]?> : “+msg+“<br />”;
  3. }

Cryptographie PHP/MySQL -AJAX - RSA

reduire

AJAX et la sécurité

le 7 mai 2006 par sahid

Ajax permet de créer des interfaces Web riches et interactives, mais Ajax se veut trÚs peu sur

Sachant que javascript n’est pas compilé, il est facilement identifiable, on peut donc determiner quelle page est appelée et quels parametres sont envoyés…

Quelques régles simples pour proteger nos applications Ajax

  • Vérifier la susceptibilité aux attaques SQL injections
  • Vérifier la susceptibilité aux injections JavaScript
  • valider toutes les données transmises
  • vérifier si les en-têtes des requêtes HTTP sont correctes
  • Ne pas considérer toutes les requêtes comme vraies

Pour les attaques aux SQL injections vous trouverez un tres bon article à télécharger sur le site phpsolmag.org

reduire

Javascript/CSS Afficher ou masquer un element HTML avec GetElementByID

le 17 avril 2006 par sahid

Introdution à GetElementById

Le formulaire html, est un des seuls moyen d’intéractivité entre le visiteur et votre site internet, l’heure du Web 2.0 et de l’objet XMLHttpRequest est au rendez vous pour rendre vos formulaires attratifs, Mais avec de simples petits scripts on peut s’amuser à rendre notre formulaire plus fonctionnel.

Afficher un Element ou le masquer à partir d’une liste

Voir l’exemple “Afficher ou masquer un element HTML avec GetElementByID”

Code HTML

  1. <label>Que voulez-vous faire ?<br/>
  2.                 <select style=“width:265px;” id=“choix” onchange=“change()”>
  3.                         <option value=“affiche”>Afficher</option>
  4.                         <option value=“affiche_pas” selected=“selected”>Ne pas afficher</option>
  5.                 </select>
  6.         </label>
  7.         <label id=“hello” style=“display:none”>Tu affiches<br/>
  8.                 <input type=“text” value=“Hello World !” size=“40″/>
  9.         </label>

Pour cet exemple on se sert de la balise

à laquelle on donne un id et un style css

  1. display:none

(on aurait bien pu utiliser n’importe quelle balise qui admet un atribut id), le style css

  1. display:none

permet de cacher l’élément

.
Pour changer le style css de notre label portant l’id “hello”, on va créer une simple fonction javascript, et pour lancer cette fonction, on va utiliser la méthode

onchange

sur une simple liste html portant id “choix”.

Notre fonction javascript

  1. <script type=“text/javascript”>
  2. function change(){           
  3.         var choix = document.getElementById(‘choix’);
  4.         if(choix.value == ‘affiche_pas’){
  5.                 document.getElementById(‘hello’).style.display = ‘none’;
  6.         }
  7.         if(choix.value == ‘affiche’){
  8.                 document.getElementById(‘hello’).style.display = ‘block’;
  9.         }
  10. }
  11. </script>

En premier on récupÚre la valeur envoyée par notre liste, on la compare.
Si la valeur envoyée est égale à “afficher”, on change le style de notre label portant l’id “hello” à la volée en utilisant une fois de plus GetElementById

  1. document.getElementById(‘hello’).style.display = ‘block’;

Ceci n’est qu’un simple exemple, on pourrait valider les champs de nos formulaires en affichant une image “valide” Ã chaque champs rempli correctement, ou encore changer le style de la balise

  1. input

, quand celle-ci est remplie correctement.

reduire

Changez pour Firefox

le 15 avril 2006 par sahid

Changer pour FirefoxJ’ai ajouté un petit script Javascript, permettant la détection du navigateur de l’utilisateur et lui conseillant si tel n’est pas le cas, l’utilisation de firefox.

Vous pouvez consulter les sources sur la page “Changez pour Firefox”, les modifier, les critiquer, les intégrer sur votre site (j’en serai ravi ! laissez l’adresse de votre site (:).