3

我正在制作一个需要登录管理页面的简单网络应用程序。我在 web.py 网站 ( http://webpy.org/cookbook/userauth )上遇到了这个咒语:

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

然而,该页面也给出了一个不祥的警告:“请勿在真实站点上使用此代码 - 这仅用于说明。”。我想知道这是否有任何重大漏洞,我对网络编程有点不熟悉,所以只是想确保使用此代码不会在不知不觉中使应用程序对微不足道的攻击向量开放?

非常感谢

4

3 回答 3

3

从 username=? 的用户中选择 * 和密码=?',(i.username,pwdhash)

^ SQL 注入,broseph。如果有人在搜索字段中输入“或 1=1”,由于 SELECT * from,他们将在 users 中获得第一个结果。通常第一个条目是管理员凭据。

于 2013-03-22T16:54:16.547 回答
1

我看到的唯一明显的问题是密码以简单的 MD5 哈希存储,没有加盐。从您的角度来看,这不是什么大问题,但从用户的角度来看,这是一个重大的安全漏洞,因为有权访问数据库的人可以通过谷歌搜索他们的 MD5 哈希值来相当容易地破解足够糟糕的密码。

于 2010-10-07T12:47:45.047 回答
0

我在这里能想到的唯一可能的问题是,是否有可能以某种方式利用MD5 冲突,即两个不同的字符串可以生成相同的 MD5 哈希 - 在这种情况下,有人可能会使用不正确的密码登录,但生成相同的 MD5 哈希。

更改为更好的散列算法,例如 SHA-1(或hashlib中可用的其他算法)将解决这个潜在的安全问题。

据我所知,利用 MD5 冲突问题来获得访问权限是非常困难的。即便如此,它还是被破坏了,并引用了维基百科文章中的安全专家Bruce Schneier的话:

[他] 写道,“[w]e 已经知道 MD5 是一个损坏的哈希函数”并且“没有人应该再使用 MD5”。

于 2010-10-07T12:44:24.457 回答