我在这里有点像菜鸟,所以我想弄清楚一些关于网络安全的基础知识。我有一个非常基本的Tornado服务器运行,虽然它只供我使用,但我想确保我没有发现任何明显的安全错误。
1)除登录处理程序之外的每个处理程序都由@tornado.web.authenticated
修饰。未经过身份验证的用户是否可以提交给我的AJAX处理程序等? (即我有多担心他们?)
2)这是我的登录和身份验证协议:
def do_auth(name, password):
with open(auth_file) as f:
lines = f.readlines()
for l in lines:
u,s,h = l.strip().split(':')
if name == u:
s5 = hashlib.sha512()
s5.update(s.decode('hex'))
s5.update(password)
if h == s5.hexdigest():
return True
return False
class LoginHandler(BaseHandler):
def get(self):
self.write('<html><body><form action="/login" method="post">'
'Name: <input type="text" name="name"><br />'
'Password: <input type="password" name="password"><br />'
'<input type="submit" value="Sign in">'
'</form></body></html>')
def post(self):
if do_auth(self.get_argument("name"), self.get_argument("password")):
self.set_secure_cookie("user", self.get_argument("name"))
self.redirect("/")
else:
self.redirect("/login")
关键是不受信任的输入仅在python的urllib.sha512.update()函数中使用,并用于字符串比较。这是“安全的”吗? [注意:auth文件是手工制作的,代码中没有任何功能可以更改它。]
3)一般来说,我应该担心哪些其他事情?
答案 0 :(得分:0)
让我试着回答一下:
(1)
除了登录处理程序之外的每个处理程序都由@ tornado.web.authenticated修饰。未经身份验证的用户是否可以提交,例如我的AJAX处理程序
如果您的AJAX处理程序使用@ tornado.web.authenticated进行修饰,则用户必须登录才能调用它。
如果没有装饰,任何人都可以访问它,并且您可以公开查看和/或写入数据。公开可见可能没问题,但公开可写可能不好。这取决于您的数据。
(2)您不需要只编写自己的do_auth()函数
def get_login_url(self):
return u"/login"
功能指向您的登录页面