Canalblog
Suivre ce blog Administration + Créer mon blog

Soucis et solutions de programmations

Soucis et solutions de programmations
Publicité
Archives
18 mai 2008

spécifications V2

Configuration technique :

Apache 2.0
PHP5

spécifications sécurité :

PHP :
- empêcher les inclusions PHP
    L'inclusion se fait principalement par la méthode $_GET. On doit empêcher de pouvoir injecter du code à travers les variables. Par exemple on transforme une url index.php?v=12 en index.php?v=12;phpinfo();
Cela permet de récupérer les informations sur la configuration php par exemple.
Pour contrer cela, on vérifie tout ce qu'on récupère. Voir ci dessous get sécurisé.
- empêcher les injections PHP / mySQL
    Les injections php / mysql sont très similaire à l'inclusion php à la différence qu'on essaye d'executer du code mysql. Avec l'exemple précédent, on suppose que v est pour une requete, ce qui donnerait
SELECT * FROM article WHERE id=$v;
Et bien on pourrait remplacer v=12 par index.php?v=12; DELETE * FROM article WHERE id != 0 ce qui a pour résultat final d'effacer une base de donnée. Voir ci dessous get sécurisé.
- empêcher les injections HTML / javascript
    Dans ce cas au lieu d'injecter du code php, on essaye d'injecter du code javascript. On peut par exemple injecter du code comme onclick="" ou autre. Voir ci dessous empêcher injection html / javascript

Authentification :

- ne pas tout baser sur les cookies. On utilise les cookies en priorités, mais si désactivé on passe par les session uniquement côté serveur
- sécuriser les sessions en ne pas les utilisants n'importe comment :
    - inclusion d'un fichier de vérification : secure
    - ne pas utiliser session_register                (session_start() à la place
    - ne pas utiliser session_unregister            (unset($_SESSION['nom_de_la_variable'])
    - ne pas utiliser session_is_registered()    (isset($_SESSION['nom_de_la_variable'])
    - encoder plutôt en sha1 qu'en md5 (md5 va devenir déprécié)
- si besoin d'une haute sécurité, ajouter SSL
- ne jamais activer les variables globals (register_globals = off)
- dans le cas d'une déconnection manuel, utiliser session_destroy()
- supprimer les session, ne pas les stocker continuellement.

Sécurité des formulaires

- Toujours faire les vérifications au niveau php, ne jamais se contenter du javascript (php doit au minimum vérifier ce que vérifie javascript)
- Toujours vérifier qu'on ne puisse pas injecter de code (htmlentities)

Administration

- le dossier d'administration doit être protégé au minimum par un htaccess
- les fichiers de configuration doivent être protégés au cas ou ils seraient lancé indépendement.
- les paramètres de configuration sont stockés dans une base de donnée. Dans le cas ou on ne veut pas utiliser de base de donnée, on peut prévoir une sauvegarde via un fichier xml.
- la première installation doit se faire facilement et être uniquement dépendante des fonctions de base du site (mot de pass administrateur, infos base de donnée). Le fichier d'installation doit être sécurisé pour qu'on ne puisse pas relancer l'installation des données à l'insu de l'administrateur.

Graphique

- la seule obligation est que le fichier soit compatible au minimum avec IE / FF, mais tester sur autant de navigateur différents est un gros +.
- la charte graphique est assez large, il n'y a pas de restriction, celle ci pouvant être adapté selon les nécessités. L'idée finale est de proposer plusieurs présentations différentes.
- Un plus est de penser la charte graphique selon l'accessibilité (par exemple pour personne mal voyante). Cela peut venir d'un css entièrement dédié à ça.

Utilisateur

L'interface utilisateur doit être la plus simple et la plus direct possible. Les liens doivent être imbriqués le moins possibles et doivent être le plus explicite et intuitif possible.



get sécurisé

dans 98% des cas, les variables passés par get sont des mots ou des valeurs numériques. Ainsi, pour empêcher l'injection de code, on peut vérifier tous les GET reçu et de les vérifier à l'aide d'une simple fonction.

function checkrequest($nom)
{

    if ( $_REQUEST[$nom] == eregi_replace('^[a-z0-9_]', '', $_REQUEST[$nom]) )
        return $_REQUEST[$nom];
    else
        return false;
}

Dans cet exemple on accepte les caractères suivants : a à z, A à Z, 0 à 9, _ On peut ajouter des caractères si nécessaires (exemple : . @ pour transmettre une adresse mail)

On donne donc le nom de la variable. Si cette dernière valide, on renvoit la variable, sinon on ren
voit false.
Cela ressemble à :

foreach($value as $_GET)
    if ( !checkrequest($value) ) exit();

Dans notre cas si une erreur existe, on quitte complètement le script, mais tout autre traitement peut être envisagé (un exit() ne sert pas à grand chose, c'était uniquement dans le cas de notre exemple).

problèmes liés aux spécifications

Toutes les spécifications de la V2 sont sensés être appliqués (et sont appliquables). Cependant elles sont parfois plus une perte de temps qu'autre chose (mais il faut quand même le faire). Dans le cas ou on fait fonctionner un module qui ne respect pas toutes les spécifications V2, il faut écrire dans un rapport en quoi ce n'est pas conforme à la V2 afin de le corriger plus tard (ne pas laisser un module non conforme à la V2).

Publicité
Publicité
17 mai 2008

Utilisation des sessions

Sites parlants des sessions :

http://www.nexen.net/index.php?option=com_nexen_v2&Itemid=232&&lang=FR&nexen_url_type=intern&nexen_path=docs%2Fphp%2Fannotee%2Fref.session.php
http://wiki.mediabox.fr/tutoriaux/php/utiliser-les-sessions-php
http://phpsec.org/projects/guide/fr/4.html
http://www.phpsources.org/tutoriel-sessions.htm
http://php.developpez.com/cours/sessions/
http://fr2.php.net/session

La bonne utilisation des sessions :

Attention : les fonctions suivantes sont dépreciées : session_register(), session_unregister(), session_is_registered()

à la place de ces fonctions on utilise
session_start();
$_SESSION[] = "";
isset($_SESSION[]);

15 mai 2008

http://www.jarodxxx.com/index.php?post/2008/05/12/

http://www.jarodxxx.com/index.php?post/2008/05/12/Des-centaines-dicones-RSS-en-3D-web-20-ou-glossy

www.jarodxxx.com

15 mai 2008

déplacer une fenetre

http://www.siteduzero.com/tuto-3-22110-1-deplacer-une-fenetre.html

11 mai 2008

liste d'adresses utiles

http://fr.selfhtml.org/html/reference/attributs.htm
http://sahid.funraill.org/category/developpements-langages/javascript-ajax/
http://www.editeurjavascript.com/trucs/35,ajax_interrogez_votre_serveur_avec_javascript.php
http://www.editeurjavascript.com/trucs/81,ajax_synchrone_et_asynchrone_des_exemples_.php

Publicité
Publicité
11 mai 2008

(css) structurer le popup

                         
// Code CSS \\

label {
    margin-left : 20px;
    float : left;
    clear : both;
}

input[type="text"] {
    border : 1px black solid;
    float : right;
    margin : 0 20px 1px 0;
    width : 260px;
}

textarea {
    border : 1px black solid;
    width : 350px;
    height : 100px;
    margin : 3px 20px 3px 20px;
}

button {
    border : 1px black solid;
    background-color: Silver;
    font-weight: bold;
    margin-left : 20px;
}
   
// Code HTML \\

<div class="conteneur" id="content" name="conte">
    <label for="isujet">Sujet : </label><input type="text" name="isujet" /><br />
    <label for="iexpediteur">Expediteur : </label><input type="text" name="iexpediteur" /><br />
    <textarea name="itexte"></textarea><br />
    <button type="button" onclick="envoyer_notification('test');">Envoyer</button>
    <button style="margin-left : 5px;" type="button">Annuler</button>
</div>

11 mai 2008

(javascript) envoi de mail de notification

var resa_id = [15022, 15634, 9763, 26253, 2213];

function envoyer_notification(formname)
{
    with ( document.getElementById(formname) )
    {
        var sujet = isujet.value;
        if ( sujet == '' ) { alert('Veuillez rentrer un sujet'); return (false); }

       

var expediteur = iexpediteur.value;
        if ( expediteur == '' ) { alert('Veuillez rentrer le mail de l\' expéditeur'); return false; }

        var texte = itexte.value;
        if ( texte == '' ) { alert('Veuillez rentrer un texte'); return false; }

       

for ( var i = 0; i < resa_id.length; ++i )
            envoyer(resa_id[i], isujet, iexpediteur, itexte);

       

return (true);
    }
}

resa_id est un tableau global créé par une fonction php en récupérant les id par méthode $_POST
la méthode envoyer n'est pas défini, on doit la remplacer par la méthode pour envoyer un mail à chacun

11 mai 2008

(javascript) inverser la selection

function reversecheck(id, nom)
{
    with ( document.getElementById(id) )
        for ( var i = 0; i < elements.length; ++i )
            if ( elements[i].type == 'checkbox' && elements[i].name == nom )
                elements[i].checked = !elements[i].checked;
}

11 mai 2008

(javascript) Fonction pour cacher/Afficher

function afficher(nom, valeur)
{
    if ( nom == undefined ) return;
    if ( document.getElementById(nom) )
    {
        if ( valeur == 'hidden' || valeur == 'visible' )
            document.getElementById(nom).style.visibility = valeur;
        else if ( valeur == '' )
        {
            if ( document.getElementById(nom).style.display == 'none' )
                document.getElementById(nom).style.display = 'block';
            else
                document.getElementById(nom).style.display = 'none';
        }
        else
            document.getElementById(nom).style.display = valeur;
        }
    else if ( document.getElementsByName(nom).length > 0 )
    {
        if ( valeur == 'hidden' || valeur == 'visible' )
            document.getElementsByName(nom)[0].style.visibility = valeur;
        else if ( valeur == '' )
        {
            if ( document.getElementsByName(nom)[0].style.display == 'none' )
                document.getElementsByName(nom)[0].style.display = 'block';
            else
                document.getElementsByName(nom)[0].style.display = 'none';
        }   
        else
            document.getElementsByName(nom)[0].style.display = valeur;
    }
    else
    {
        if ( valeur == 'hidden' || valeur == 'visible' )
            nom.style.visibility = valeur;
        else if ( valeur == '' )
        {
            if ( nom.style.display == 'none' )
                nom.style.display = 'block';
            else
                nom.style.display = 'none';
        }
        else   
            nom.style.display = valeur;
        }
}

Utilisation :
on peut préciser 'hidden' / 'visible' ou 'none' / 'block'
- hidden/visible cache le paramètre mais garde l'espace occupé par les objets
- none/block cache le paramètre mais cache l'espace occupé par les objets

pour le nom en paramètre, si celui ci est le nom d'un form on peut le passer directement en paramètre sans ' ' (ou " ").
Dans le cas d'une utilisation sur un autre objet, on passe le name en ' ' ou " ".
On passe toujours par l'élément 0 de getElementByName, donc toujours faire attention à ne pas utiliser deux fois le même name.

Si on ne passe pas de paramètre hidden/visible none/block le bouton alterne sur afficher/cacher en mode none/block

edit : sous IE getElementsByName ne marche pas, il récupère les ID. Il est donc plus simple de tout passer par ID, la compatibilité est gardé sous firefox et IE. On peut donc supprimer getElementsByName de la fonction


function
afficher(nom, valeur)

{
    if ( nom == undefined ) return;
    if ( document.getElementById(nom) )
    {
        if ( valeur == 'hidden' || valeur == 'visible' )
            document.getElementById(nom).style.visibility = valeur;
        else if ( valeur == '' )
        {
            if ( document.getElementById(nom).style.display == 'none' )
                document.getElementById(nom).style.display = 'block';
            else
                document.getElementById(nom).style.display = 'none';
        }
        else
            document.getElementById(nom).style.display = valeur;
    }
    else
    {
        if ( valeur == 'hidden' || valeur == 'visible' )
            nom.style.visibility = valeur;
        else if ( valeur == '' )
        {
            if ( nom.style.display == 'none' )
                nom.style.display = 'block';
            else
                nom.style.display = 'none';
        }
        else   
            nom.style.display = valeur;
        }
}

version simplifié : tout passe par de l'ID

function afficher2(nom, valeur)
{
    if ( !document.getElementById(nom) ) return;
    if ( valeur == '' )
    {
        if ( document.getElementById(nom).style.display == 'none' )
            document.getElementById(nom).style.display = 'block';
        else
            document.getElementById(nom).style.display = 'none';
    }
    else
        document.getElementById(nom).style.display = valeur;
}

7 mai 2008

Afficher cacher des éléments

function afficher(nom, valeur)
{
    nom.style.visibility = valeur;
}

// nom = control à cacher / afficher (on peut l'utiliser sur des form, div, ...)
// valeur = 'hidden' ou 'visible'

Si on veut le faire depuis un select

<select onchange="afficher(div_mail, this.options[this.selectedIndex].value);">
    <option value="visible">oui</option>
    <option value="hidden">non</option>
</select>
<div id="div_mail">
    <label for="ismtp">smtp</label><input type="text" name="smtp" />
    <br /><label for="iweb">mail</label><input type="text" name="web" />
</div>

Ici on choisis si oui ou non on affiche le div div_mail
on peut utiliser autre chose qu'un div comme conteneur

Publicité
Publicité
1 2 > >>
Publicité