OVH Community, votre nouvel espace communautaire.

Protégez vos formulaires email !


Leksa
18/02/2007, 13h16
Bonjour,

Bien que ce message date de quelques mois, ce script m'interesse aussi mais le lien de l'image est mort est-il possible de l'avoir de nouveau s'il vous plait afin de proteger mes formulaires.

De plus je ne vois pas trop comment est fichu celui-ci, en effet dois je crée par exemple un fichier contact_us.php qui va etre traité (par exemple) par contact_us_traitement.php ?

Merci
Bye

webzed
25/11/2006, 16h08
Mon hébergement supporte php et je pense aussi inclure la librairie GD2.

Si j'ai bien compris, je transforme ma page html du formulaire en php. Je mets la première partie du code au début de ma page. Quand aux 2 autres parties du code je ne vois pas où je dois les mettre.

visualight
25/11/2006, 14h24
Salut

1. Il faut savoir que ta page formulaire doit être en php
2. Ton site doit supporter php et doit inclure la librairie GD2.

Je metterai prochainement un HowTo pour installer ne protection semblable qui ne requiert pas de librairie GD2 et qui fonctionnera via session sur base de génération MD5.

Pour répondre à ta question : C'est dans le formulaire que tu dois inclure le script php pas dans le fichier pl.

Sinon, il est vrai qu'il faut un minimum de connaissances en php et sql pour mettre en route le système.

Mais rien n'est impossible et beaucoup de gens sont la pour vous aider.
Je pense nottament à ASP-PHP.NET ou PHPDEBUTANT.COM

@+

webzed
25/11/2006, 13h27
Bonjour,

visualight, comment dois-je faire pour mettre en place le système anti-spam pour qu'l fonctionne avec les 2 formulaires présents sur mon site :

- le premier est un formulaire de demande de renseignements il fonctionne avec 2 fichiers :
- un avec le formulaire en html et le second que j'appelle pour l'envoi qui est un script cgi :formmail.pl

Le second formulaire est un formulaire qui permet d'envoyer des fichiers joints, il fonctionne aussi avec 2 fichiers :
- un avec le formulaire en html et le second que j'appelle pour l'envoi qui est un script php : formmail+.php

Quand à "comment me protéger des attaques par injection sql" ??????

Comme vous l'avez compris je ne suis pas un expert, merci d'avance pour votre aide.

Pako
24/11/2006, 15h47
Citation Envoyé par visualight
Envoi moi tes fichiers par mail, je le met en place et après regarde comment c'est fait.
+ simple ...

Ok c'est fait ! ;-)

visualight
24/11/2006, 15h41
Envoi moi tes fichiers par mail, je le met en place et après regarde comment c'est fait.
+ simple ...

Pako
24/11/2006, 15h12
Aie aie aie !

J'ai compris un peu mais je ne suis pas aussi expert que certains...

Voilà j'ai deux fichiers :
- un avec le formulaire de devis en php
et j'autre que j'apelle pour valider qui est un form2mail.php

Ma question est la suivante :
Où dois je mettre le premier code : Le code secret, pour rester secret ?
Le second et le dernier ?

Dans le second il est écrit :
- votre code de traitement du formulaire, Ok mais c'est quoi ? mon formulaire tout simplement ?
- votre code de traitement de code secret invalide; c'est quoi ?
Et enfin :
- votre code de traitement de retour : où est il ?

Désolé pour poser ce genre de question mais je suis un peu perdu...

Merci à tous

visualight
23/11/2006, 14h20
...

visualight
23/11/2006, 13h26
Maintenant, nous allons voir comment se protéger des injections SQL ... héhé

Introduction

Ce type d'attaque vise les serveurs web et plus particulièrement les erreurs de programmation au niveau des scripts asp, cgi, php, etc. Ces mêmes scripts exécutant des requêtes sql... Ce sujet est assez ancien mais on peut qu'il est toujours resté d'actualité ne serait-ce que suite à l'utilisation abondante du asp et du php. Aussi, pas mal d'articles sur ce sujet ont précéder celui-ci et il est bien entendu que certains n'y verront, pour sûr, que le côté rébarbatif. Mais l'important pour moi, en écrivant cet article est d'expliquer cela par mes propres mots de façon à aider les débutants, et d'adapter ce type de vulnérabilité à l'actualité.

Qu'est qu'une attaque de type sql injection ?

Comme vous le savez certainement déjà, SQL (Structured Query Language) est un language de base de données, celles-ci représentant le coeur de beaucoup d'applications web de nos jours. C'est un language basé sur des requêtes utilisant des instructions telles que INSERT (insertion de données dans la base de données), DELETE (pour en supprimer), UPDATE (pour en mettre à jour), SELECT (pour en sélectionner et lire), et bien d'autres. Mais cette simplicité en fait aussi une proie facile aux détections de failles.

Exemple de reqûete :

Code:
SELECT * FROM users WHERE login = 'damien';
Cette requêtes aura pour effet de sélectionner l'utilisateur (extrait de la table "users") dont le login est "damien". "SELECT *" signifiant qu'on sélectionne tous les champs de cette table mais peu importe pour le moment.

Continuons sur cet exemple pour bien vous faire comprendre ce qu'est une attaque de type sql injection (Mon exemple n'étant pas du pur hasard puisqu'une attaque de ce type dans le but de récuperer un mot de passe ou de s'identifier est certainement la plus courante).

Maintenant imaginons que ma page contienne un formulaire d'identification utilisateur de ce type :

Voir ici: http://users.skynet.be/rmsoft/sqlinject/logintest.htm

La requête associée à ce formulaire permettant de vérifier que les login / password entrés sont valides par rapport à notre base de données serait :

Code:
mysql_query("SELECT * FROM users WHERE utilisateur = '$login' AND motdepasse = '$password'");
Cette requête aurait pour effet de sélectionner l'utilisateur en question si le nom d'utilisateur ET le mot de passe entrés sont dans notre base de données. Si l'un des deux est erroné, la requête ne renverra aucun résultat.

L'attaque en question

Sachant que sur mon exemple la variable $login contient ce que j'ai tapé dans mon premier champ de texte et que la variable $password contient de même ce que j'ai tapé dans le deuxième champ de texte (mot de passe), imaginez ce que cela pourrait donner si j'entrais ceci dans le premier champ de texte :

Voir ici : http://users.skynet.be/rmsoft/sqlinject/attaque.htm

Si maintenant nous allons voir ce qui se passe du côté du code, ma requête deviendrait alors :

Code:
mysql_query("SELECT * FROM users WHERE utilisateur = '' OR 1=1"); //' AND motdepasse = '$password'");
Et elle permettrait certainement d'identifier car la requête est vraie si un utilisateur "" existe OU si 1=1. Comme il est évident que 1 est égal à 1, elle serait vraie. Le signe "//" signifiant un commentaire en php, le reste serait rendu inutile.

Il est vrai que ma requête est un peu tirée par les cheveux, mais imaginez maintenant que je sache qu'un certain damien est possède les droits administrateurs et que je rentre ceci dans mon champ de texte :

Voir ici : http://users.skynet.be/rmsoft/sqlinject/resultat.htm

Il sélectionnera alors l'utilisateur damien sans se préoccuper du mot de passe en suivant le même raisonnement de précédemment.

Démonstration d'autres types d'attaques

Dans notre exemple précédent, nous ne faisions que nous identifier et nous aurions très bien pu récupérer un mot de passe de la même façon. Mais ce n'est pas tout ce qu'on pourrait faire avec une injection sql. Maintenant que vous avez compris comment vous "fabriquer" vos propres requêtes, voici quelques exemples de requêtes venant à effectuer des modifications sur les données ou même le système cette fois-ci.

login : ' OR 1=1"); drop table users;
password : n'importe lequel
Celle-ci supprimerait complètement la table users.

login : '; exec master..xp_cmdshell 'net stop firewall'; --
password : n'importe lequel
Sachant que je suis repassé dans une syntaxe sql utilisée sur asp, cette requête ci-dessus aurait pour effet d'exécuter une commande shell "net stop firewall" qui stopperait l'exécution du service "firewall". Et puisque le serveur sql est lancé en tant que SYSTEM par défaut, nous aurions tout à fait ce droit d'arrêt des services.

login : '; shutdown with nowait; --
password : n'importe lequel
Ce dernier exemple aurait pour effet de stopper le serveur sql immédiatement. Ce que j'aurai pu faire aussi avec ma commande shell précédente en spécifiant le nom du service du serveur mysql bien entendu.

Mais ce ne sont que quelques exemples car les possibilités sont malheureusement nombreuses ...

Comment se protéger des attaques par injection sql ?

Comme vous pouvez vous en douter, le seul moyen de prévenir ces attaques se trouve au niveau de la programmation. Si celle-ci est bien réalisée, elles ne sont normalement plus possibles. Alors...quelles sont les règles de programmation à prendre en compte ?

- Tout d'abord, évitez d'utiliser un compte ayant tous les pouvoirs pour l'exécution de votre serveur sql si possible.

- Supprimer les fonctions que vous n'utilisez pas telle que celle que nous avons vu : master..xp_cmdshell, et de manière générale toutes celles commencant par "master..xp".

- Vérifiez les entrées utilisateurs telles que les champs de texte. Vérifiez aussi que les nombres attendus soient bien des nombres avec une fonction telle que IsNumeric() par exemple.

- Vérifiez aussi les paramètres des URL qui sont ajoutables.

- Utilisez les caractères et fonctions d'échappement telles que AddStripSlashes() en php, voir les caractéristiques de la fonction et en général les documentations de vos languages de programmation web pour plus d'infos. Cela empêchera par exemple l'entrée utilisateur du caractère ' en l'échappant à l'aide d'un slash le précédent.

- Vous pouvez aussi empêcher d'une manière générale certaines séquences d'entrées utilisateurs telles que ";", "insert", "select", "//", "--", etc.

- Attention aussi à limiter le nombre de caractères qu'un utilisateur peut entrer dans un champ de texte, car ceci peut fort bien lui compliquer la tâche.

- Pour finir, attention à ce que vous mettez dans les cookies, car un mot de passe (même crypter en md5) est vite trouvé par une attaque de ce type. Et par la suite un remplacement de cette valeur dans le cookie évite à l'attaquant une attaque de type brute force ; c'est donc un joli cadeau.

Concrètement ...

Voici un petit script pour éviter les injections SQL sur votre site, je vous conseille vivement ( à adapter suivant vos formulaires bien évidemment )

Code PHP:
function anti_injection$user$pass )
{
        
# on regarde si ya pas des commandes sql.

    
$banlist = array
        (
        
"insert""select""update""delete""distinct""having""truncate""replace",
        
"handler""like""procedure""limit""order by""group by" ,"or" //or n'est pas conseillé mais je le met qd meme
        
);

    if ( 
eregi "[a-zA-Z0-9]+"$user ) )
    {
        
$user trim str_replace $banlist''strtolower $user ) ) );
    }
    else
    {
        
$user NULL;
    }

    
# on regarde si le mot de passe est bien alphanumerique
    # on utilise strtolower() pour faire marcher str_ireplace()

    
if ( eregi "[a-zA-Z0-9]+"$pass ) )
    {
        
$pass trim str_replace $banlist''strtolower $pass ) ) );
    }
    else
    {
        
$pass NULL;
    }

    
# on fait un tableau
    # si il ya des charactere inégal on stop tout


    
$array = array ( 'user' => $user'pass' => $pass );

    if ( 
in_array NULL$array ) )
    {
        die ( 
'ERREUR : Injection SQL détectée' );
    }
    else
    {
        return 
$array;
    }
}
//##############################################################################

$login anti_injection ($_POST['pseudo'],$_POST['pass']); //on lance la fonction danti injection


$password $login['pass']; //on recupere le pass
$password=md5($password); //on met le pass en md5

$pseudo $login['user']; //on recupere le pseudo
?>

Conclusion

Nous avons pu voir différents types d'attaques réalisables par injection sql ainsi que des moyens de les prévenir, en espérant que votre vision de la programmation sql aura évoluée du côté de la sécurité, et que vous pourrez vous-mêmes essayer de remédier à ces failles dans vos applications web si besoin est puisque c'est le but.

Volontairement je ne me suis pas attardé sur l'ajout de paramètres dans une URL, qui peut provoquer une injection sql de la même façon car le principe est le même, sauf que les formulaires vulnérables seront des formulaires les plus souvent cachés cette fois-ci.

Voilà...garder en tête qu'aucune application web utilisant une base de données n'est totalement sécurisée si vous ne vous en préoccuper pas

@+

Spamplemousse
22/11/2006, 21h42
Excellente initiative -- j'ai rajouté un lien direct sur http://forum.ovh.net/showthread.php?p=42259#post42259

Ainsi, la boucle est bouclée

PS: attention, insérer un test de Turing ne dispense pas de sécuriser les formulaires en question afin de les prémunir contre les attaques par injection, qui peuvent avoir des conséquences catastrophiques, en particulier pour les injections de code SQL...

visualight
22/11/2006, 19h59
J'ai décidé de mettre ce How2 en route suite au post de spamplemousse :
http://forum.ovh.com/showthread.php?t=9839

Nous allons voir comment mettre en place un système anti-spam en PHP pour vos formulaires...

L'objet de ce script est de protéger vos formulaires de contact par un code secret généré graphiquement à recopier dans un champ du formulaire afin d'éviter à des robots de vous bombarder de mails de spam.

Ce script utilise la librairie GD2


La code secret, pour rester secret , est passé par variable de session.
Au début de votre page contenant le formulaire, insérez le code suivant:
Code PHP:
     session_start();//ouverture d'une session
     
$secret=""//initialisation du code secret
     
for($i=0;$i<5;$i++) { //génération du code secret à 5 caractères
          
$secret.=chr(mt_rand(6590));
     }
     
$_SESSION['secret'] = $secret;//stockage du code dans une variable de session
?>
Votre script de traitement de formulaire doit resembler à ceci :
Code PHP:
     session_start();
     if (
$_POST['Secret']==$_SESSION['secret']) { // code secret valide

          
votre code de traitement du formulaire

     
} else { // code scret invalide

          
votre code de traitement de code secret invalide

     
}
     unset(
$_SESSION['secret']); // on detruit le code secret

     
votre code de traitement de retour
?>
Enfin, le script de génération de code secret :
Code PHP:
   session_start();   //demarrage de la session
   
$text=$_SESSION['secret']; //on récupére le code à générer
   
header("Content-type: image/png"); //définition du type d'image générée (png)
   
$im imagecreatefromjpeg("secret.jpg");// Création de l'image à partir d'un fichier contenant le fond de l'image à générer
   
$id imagecreatefromjpeg("secret.jpg");// Création d'une deuxième image identique
   
$grey imagecolorallocate($im128128128); // définition de la couleur "gris"
   
$black imagecolorallocate($im000); // définition de la couleur "noir"
   
$font 'COURBD.TTF';// à remplacez le chemin par votre propre chemin de police TTF
   
for($i=0;$i<5;$i++) {   //boucle de génération des 5 caractères du code secret
      
$angle=mt_rand(10,30);   //définition d'un angle aléatoire entre 10 et 30 degrés
      
if(mt_rand(0,1)==1$angle=-$angle//définition aléatoire du signe à appliquer à l'angle
      
imagettftext($im14$angle11+(20*$i), 21$grey$fontsubstr($text,$i,1));// génération de l'ombre d'un caractère du code secret en gris
      
imagettftext($im14$angle10+(20*$i), 20$black$fontsubstr($text,$i,1));// génération du caractère du code secret en noir
   
}
   
$id=imagerotate $id180,); // on applique une rotation de 180° à notre deuxième image créée à partier de l'image de fond
   
imagecopymerge $im$id00001203050 ); //on fusione cette image à notre code secret avec un facteur de tranparence de 50%
   
imagepng($im); //notre code secret est terminé
   
imagedestroy($im); //on libére nos ressources images
   
imagedestroy($id);
?>
Je vous donne aussi l'image utilisée pour tramer le code secret :
http://users.skynet.be/rmsoft/images/secret.jpg


Voilà, c'est fini!