如何在龙卷风中制作“易腐”链接

时间:2013-01-28 13:45:32

标签: validation tornado

我想建立一个仅24小时有效的链接,这是为了验证目的,所以我的问题很简单:

如何使此链接仅在此时有效;我有一个提示:

  1. 获取纪元时间。
  2. 仅使用此值创建链接:something.com/time/1359380374
  3. 当用户对链接进行陈词滥用时,请提取此值并进行比较。
  4. 我听说过Hash值?为什么?我们无法从哈希值中获取时间(反转过程),以便如何完成?

2 个答案:

答案 0 :(得分:2)

最好的办法是让用户将电子邮件作为参数发送,然后查询数据库以查看其链接是否已过期:

请求的链接查询update users set locked_stamp = now();

请求网址http://yourdomain.com/?email=useremail

查询select true from users where email = '$email' and locked_stamp > now()-interval 1 hour and now() limit 1

结果:您有一个人在一小时内通过电子邮件请求$email


我有一个使用base64编码时间戳的脚本......但它无论如何都不安全。

import tornado.web
import base64, re, time
import sys

def get_time():
    """Method used to get the current time in b64"""
    return base64.b64encode(str(int(time.mktime(time.localtime()))))

class WebHandler(tornado.web.RequestHandler):
    def get(self, _time):
        timecheck = base64.b64decode(_time)
        try:
            #require it to be all digits
            assert re.match('^\d+$', timecheck) is not None
            # Must be within 1 hour: greater then 1 hour ago and less then now
            assert int(timecheck) > int(time.mktime(time.localtime()))-3600 and \
                int(timecheck) < int(time.mktime(time.localtime()))
        except AssertionError:
            raise tornado.web.HTTPError(401,'Woops! Unauthorized.')
        else:
            self.write('Pass')


# Route
application = tornado.web.Application([
    (r"/([^\/]+)/?", WebHandler),
])


if __name__ == "__main__":
    application.listen(8889)
    tornado.ioloop.IOLoop.instance().start()

答案 1 :(得分:0)

与设置安全cookie的方式相同:

signed_message = self.create_signed_value(secret, name, value)

然后你可以检查一下:

message = self.decode_signed_value(secret, name, value, max_age_days=31, clock=None,min_version=None)

秘密应该是一个很长的随机数,但每个应用只需要一个。 min_version可能是DEFAULT_SIGNED_VALUE_VERSION(目前为2)。

不要推出自己的解决方案。使用库中的那个。在那。有用。