2010-10-07 30 views
3

Je crée une application web simple qui nécessite une connexion pour la page d'administration. Je suis tombé sur ce incantatoire sur le site web.py (http://webpy.org/cookbook/userauth):Authentification sur Web.py - ce code sera-t-il dangereux pour la production?

import hashlib 
import web  

def POST(self): 
    i = web.input() 

    authdb = sqlite3.connect('users.db') 
    pwdhash = hashlib.md5(i.password).hexdigest() 
    check = authdb.execute('select * from users where username=? and password=?', (i.username, pwdhash)) 
    if check: 
     session.loggedin = True 
     session.username = i.username 
     raise web.seeother('/results') 
    else: return render.base("Those login details don't work.") 

Cependant la page donne également un avertissement un peu sinistre: «Ne pas utiliser ce code sur le site réel - c'est uniquement pour illustration ». Je me demandais s'il y avait des trous majeurs dans ce domaine, je ne suis pas familier avec la programmation web, donc je voulais juste m'assurer que l'utilisation de ce code ne rendrait pas l'application ouverte aux vecteurs d'attaque triviaux?

Un grand merci

Répondre

0

Le seul problème possible que je peux penser ici, pourrait être si elle serait en quelque sorte possible d'exploiter MD5 collisions, à savoir que les deux chaînes différentes peuvent générer le même hachage MD5 - dans ce cas où quelqu'un pourrait potentiellement connectez-vous avec un mot de passe incorrect, mais génère le même hachage MD5.

La modification d'un meilleur algorithme de hachage tel que SHA-1 (ou quelque chose d'autre disponible dans hashlib) permettrait de résoudre ce problème de sécurité potentiel. Pour autant que je sache, il serait très difficile d'exploiter le problème de collision MD5 pour accéder. Même si, il est brisé, et citant le gourou de la sécurité Bruce Schneier de l'article wikipedia:

[il] a écrit de l'attaque que « [l] e savait déjà que MD5 est une fonction de hachage cassé » et que « non on devrait utiliser MD5 plus. "

+0

compris, merci beaucoup! – Malang

1

Le seul problème évident évident que je vois est que le mot de passe est stocké avec un simple hachage MD5 sans sel. De votre point de vue, ce n'est pas vraiment un problème, mais du point de vue de l'utilisateur, c'est une faille de sécurité majeure car quelqu'un ayant accès à la base de données peut facilement casser suffisamment de mots de passe.

3

Sélectionnez * parmi les utilisateurs où nom d'utilisateur =? et password =? ', (i.nom d'utilisateur, pwdhash)

^Injection SQL, brosph. Si quelqu'un fait 'ou 1 = 1' dans le champ de recherche, il obtiendra le premier résultat dans les utilisateurs à cause du SELECT * de. Souvent, la première entrée est les informations d'identification de l'administrateur.