2010-10-07 53 views
3

我正在製作一個簡單的網絡應用程序,需要登錄管理頁面。我碰到這個咒語來在web.py網站(http://webpy.org/cookbook/userauth):在Web.py上進行身份驗證 - 此代碼是否對生產不安全?

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.") 

然而頁面也給出了幾分不祥的警告:「不要使用真正的網站的代碼 - 這僅僅是爲了說明」。我想知道在這裏是否有任何主要漏洞,我對網絡編程有點不熟悉,所以只是想確保使用這些代碼不會在不知情的情況下讓應用程序對平凡的攻擊媒介開放?

非常感謝

回答

0

唯一可能的問題,我能想到的在這裏,可能是它是否會以某種方式可以利用MD5 collisions,即兩個不同的字符串可以產生相同的MD5哈希 - 在這種情況下,有人可能會潛在地使用不正確的密碼登錄,但生成相同的MD5哈希。

更改爲更好的哈希算法,如SHA-1(或其他可用於hashlib的算法)將會消除這種潛在的安全問題。

據我所知,利用MD5碰撞問題獲取訪問權限是非常困難的。即便如此,它壞了,從維基百科的文章引用安全專家Bruce Schneier

[他]說攻擊說:「[我們]已經知道,MD5是一個破碎的哈希函數」和「無應該再使用MD5了。「

+0

非常感謝,非常感謝! – Malang 2010-10-07 14:21:50

1

我看到的唯一顯而易見的問題是密碼與簡單的MD5散列一起存儲,沒有鹽。從您的角度來看,這不是一個問題,但從用戶的角度來看,這是一個重大的安全漏洞,因爲訪問數據庫的人可以通過使用他們的MD5哈希值來輕鬆破解足夠糟糕的密碼。

3

select * from username where username =?和密碼=',(i.username,pwdhash)

^SQL注入,broseph。如果某人在搜索字段中輸入'或1 = 1',則由於SELECT * from,他們將在用戶中獲得第一個結果。通常第一項是管理員憑證。

相關問題