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

Eléphant du PHP | 288 Messages

20 mai 2009, 20:45

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.

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 21:21

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.

Eléphant du PHP | 288 Messages

20 mai 2009, 21:35

Merci de ta réponse mais pourrais-tu être un plus clair je vois pas trop l'avantage, désolé

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 21:37

Si ton formulaire soumet séparément un sha1 de ton pasword, c'est exploitable, c'est ce que je voulais dire.

Eléphant du PHP | 288 Messages

20 mai 2009, 21:46

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 ?

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 21:55

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 ?

Eléphant du PHP | 288 Messages

20 mai 2009, 22:08

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é ?

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 22:16

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.

Eléphant du PHP | 288 Messages

20 mai 2009, 22:27

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?

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 22:31

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();">

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 22:37

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

Eléphant du PHP | 288 Messages

20 mai 2009, 22:40

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

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 22:53

Peut-être n'a tu pas vu ma dernière réponse... pour moi le salt est différent à chaque envoi du formulaire.

Eléphant du PHP | 288 Messages

20 mai 2009, 23:17

okay okay

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

ViPHP
AB
ViPHP | 5818 Messages

20 mai 2009, 23:32

Utiliser mysqli_real_escape_string pour protéger les requêtes et caster les entiers comme tu le fais est une bonne chose.