Page 1 sur 2

Sécurisation d'une application flash/php/mysql

Posté : 20 mai 2009, 20:45
par damaskinos
Bonjour à tous,

Je viens demander votre avis au sujet de la sécurité d'une application flash/php/mysql. N'étant pas un expert en sécurité vos suggestions seront bienvenu.

En général, j'utilise mysqli_real_escape_string pour les injections sql. Tout ce qui est ID, j'utilise
$id = intval($id)
Pour m'assurer d'avoir un entier. Pour la communication flash et php, a chaque fois que j'ai une requete de flash, je reçois un xml avec un id session. Ensuite je verifie dans une table session la combinaison browser, ip et session id, si l'utilisateur exist je clean ma table je regenere une nouvelle session id je traite la demande et renvoie la reponse avec le nouvelle id regeneré. Pour mes mots de passe je procède ainsi:

$tab['salt']         = hash('sha1', uniqid(rand(), true));
$tab['password'] = sha1($tab['password'].$tab['salt']);

ensuite le salt et le password sont conservés pour vérification future.
C'est a peu près ce qui est mis en place jusqu' à maintenant. J'aimerai en premier lieu que vous me donniez vos avis la dessus. En second lieu, la premiere fois qu'un utilisateur s'enregistre il m'envoie pas de session, logique, juste le formulaire que je vérifie avec les vérifications d'usage, email valide etc.., ensuite je l'enregistre dans ma base mais vue que je récupère juste le formulaire il pourrait venir de n'importe ou, comment puis-je m'assurer que c'est bien mon flash qui m'envoie le formulaire?

J'ai aussi un post interressent sur les attaques par force brute, je vais surement faire du blacklistage pour ca.

Merci de vos suggestions

[EDIT] JE tiens à préciser que même si une personne réussi à enregistrer un utilisateur, dans le script d'enregistrement, je met de façon brute les permissions donc l'utilisateur aura juste les permissions d'un utilisateur mais ca reste quand même embêtant.

Posté : 20 mai 2009, 21:21
par AB
Pour un maximum de sécurité concernant la soumission du formulaire d'authentification il serait bien que sha1($tab['password'].$tab['salt']) soit généré en javascript par le navigateur du visiteur, ainsi cette combinaison même interceptée serait inexploitable.

Posté : 20 mai 2009, 21:35
par damaskinos
Merci de ta réponse mais pourrais-tu être un plus clair je vois pas trop l'avantage, désolé

Posté : 20 mai 2009, 21:37
par AB
Si ton formulaire soumet séparément un sha1 de ton pasword, c'est exploitable, c'est ce que je voulais dire.

Posté : 20 mai 2009, 21:46
par damaskinos
ok je vois merci encore.

Vue que je suis en flash et action etant coté client, je crois ça reviendrais au même de e faire avec action script. Reste à voir si action script gère sha1 :? . Pour recapituler,

Je ferais un sha1 coté client du password, ensuite une fois recupéré sur le serveur je génère mon grain de sel et sha1 le tout c'est ?

Posté : 20 mai 2009, 21:55
par AB
Non,

Sur le principe, tu génères le sha1 - de ton pasword concaténé au sel - en javascript côté client et tu envoie cette donnée et uniquement celle-ci dans le post d'authentification.
Par ailleurs il faut que le sel soit différent pour chaque post.

T'as compris le principe ?

Posté : 20 mai 2009, 22:08
par damaskinos
Je crois pas non, je suis desolé, il doit y avoir qq chose je loupe.

Mais dans ton cas je fais comment pour les authentification si le salt a ete généré coté client et jamais envoyé pour être gardé ?

Posté : 20 mai 2009, 22:16
par AB
Le sel tu le connais côté serveur...
Ce n'est pas le sel que tu génère en javascript mais le sha1 de la mixture pasword.sel que tu envoie dans ton post.

Posté : 20 mai 2009, 22:27
par damaskinos
ok je vois,

Moi en fait quand un utilisateur s'enregistrait, je générais un salt coté serveur qui lui était propre, donc chaque utilisateur a un salt qui lui ai propre, donc à chaque fois qu'un utilisateur se connecte, je vérifie je fais une requete imbrique une qui retourne le sha1 que je concatene et sha1 avec le password dans la condition where. Ca me fait une requete plus complexe mais bon. De ta façon j'aurais un salt unique pour tout le monde c'est ca?

Posté : 20 mai 2009, 22:31
par AB
Sur le principe la fonction js ressemble à ça http://www.developpez.net/forums/d32278 ... chier-ini/

Le lien donne un exemple pas très bien codé :
A la place de onClick="doChallengeResponse(); return false;" dans l'input submit, une meilleure méthode est de faire <form action="#" method="post" id="identification" onsubmit="doChallengeResponse();">

Posté : 20 mai 2009, 22:37
par AB
J'avais pas vu ta réponse.

Moi je génère un salt différent pour chaque envoi de formulaire.
Ta requête peut être simplifiée parce que tu peux envoyer par exemple le login en clair et puisqu'il se doit d'être unique tu n'a qu'a vérifier si la mixture sha1(mdp.sel) correspond; tu peux aussi faire sha1(sha1(mdp).sha1(sel)) pour compliquer

Posté : 20 mai 2009, 22:40
par damaskinos
OK ca je comprend, lui il fais un md5 du login de l'utilisateur et du password, c'est le principe du salt que j'arrive pas a comprendre peux-tu repondres a mon précédent POST et me dire si c'est ca.

merci encore

Posté : 20 mai 2009, 22:53
par AB
Peut-être n'a tu pas vu ma dernière réponse... pour moi le salt est différent à chaque envoi du formulaire.

Posté : 20 mai 2009, 23:17
par damaskinos
okay okay

je vois c'est ca j'avais pas compris. Mais dis moi pour le reste ca semble ok.

Posté : 20 mai 2009, 23:32
par AB
Utiliser mysqli_real_escape_string pour protéger les requêtes et caster les entiers comme tu le fais est une bonne chose.