我正在制作一个简单的网络应用程序,需要登录管理页面。我在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.")
然而,该页面也提出了一个有点不祥的警告:“不要在真实网站上使用此代码 - 这只是为了说明。”我想知道这是否有任何重大漏洞,我对网络编程有点不熟悉所以只是想确保使用这段代码不会在不知不觉中使应用程序对琐碎的攻击向量开放?
非常感谢
答案 0 :(得分:3)
从用户名=?的用户中选择*和密码=?',(i.username,pwdhash)
^ SQL注入,broseph。如果有人在搜索字段中输入'或1 = 1',则由于SELECT * from,他们将在用户中获得第一个结果。第一个条目通常是管理员凭证。
答案 1 :(得分:1)
我看到的唯一明显的问题是密码存储为简单的MD5哈希,没有盐。从您的角度来看,这不是一个问题,但从用户的角度来看,这是一个主要的安全漏洞,因为有权访问数据库的用户可以通过Google搜索他们的MD5哈希来轻松破解足够糟糕的密码。 / p>
答案 2 :(得分:0)
我能想到的唯一可能的问题是,如果以某种方式可以利用MD5 collisions,即两个不同的字符串可以生成相同的MD5哈希 - 在这种情况下有人可能会登录密码不正确,但生成相同的MD5哈希值。
更改为更好的哈希算法(如SHA-1(或hashlib中提供的其他内容))可以解决此潜在的安全问题。
据我所知,利用MD5碰撞问题获取访问权限非常困难。即便如此,它仍然被打破,并引用了维基百科文章中的安全大师Bruce Schneier:
[他]写道,“[已经知道MD5是一个破坏的哈希函数”并且“没有人应该再使用MD5了。”