Web.py的认证 - 这个代码在生产中是否安全?

3 投票
3 回答
2067 浏览
提问于 2025-04-16 05:08

我正在制作一个简单的网页应用,需要登录才能进入管理员页面。我在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.")

不过,这个页面也给出了一个有点吓人的警告:“不要在真实网站上使用这段代码——这只是为了演示。”我在想,这段代码有没有什么大问题,因为我对网页编程不太熟悉,所以想确认一下使用这段代码不会无意中让我的应用容易受到攻击吧?

非常感谢

3 个回答

1

我看到的一个明显的问题是,密码是用简单的MD5哈希存储的,而且没有加盐。对你来说,这可能不是个大问题,但对用户来说,这就是一个严重的安全漏洞。因为如果有人能访问数据库,他们可以很轻松地通过在网上搜索这些MD5哈希值来破解那些比较弱的密码。

3

这段代码的意思是从用户表中选择所有信息,条件是用户名和密码要匹配给定的值。

但是,这里有个安全隐患,叫做SQL注入。如果有人在搜索框里输入了'or 1=1',那么这个查询就会变得很奇怪,因为'1=1'永远是对的,这样就会返回用户表中的第一个结果。通常情况下,第一个结果可能就是管理员的账号和密码。

0

我能想到的唯一可能的问题就是,可能会有人利用MD5碰撞的漏洞。简单来说,就是有两个不同的字符串可能会生成相同的MD5哈希值。在这种情况下,有人可能会用一个不正确的密码登录,但这个密码生成的MD5哈希值却和正确的密码是一样的。

如果换成更好的哈希算法,比如SHA-1(或者其他在hashlib中可用的算法),就能解决这个潜在的安全问题。

据我所知,利用MD5碰撞问题来获取访问权限是非常困难的。不过,MD5确实已经不安全了。安全专家Bruce Schneier在维基百科的文章中提到过:

[他]说过这个攻击,“我们早就知道MD5是一个不可靠的哈希函数”,并且“没有人应该再使用MD5了。”

撰写回答