我想创建一个仅在 24 小时内有效的链接,这是出于验证目的,所以我的问题很简单:
我如何使此链接仅在此时有效;我有一个提示:
- 获取纪元时间。
- 仅使用此值创建链接:something.com/time/1359380374
- 当用户点击链接时,提取该值并进行比较。
我听说过哈希值?为什么?我们无法从哈希值中获取时间(反转过程)那么这是如何完成的呢?
我想创建一个仅在 24 小时内有效的链接,这是出于验证目的,所以我的问题很简单:
我如何使此链接仅在此时有效;我有一个提示:
我听说过哈希值?为什么?我们无法从哈希值中获取时间(反转过程)那么这是如何完成的呢?
最好的办法是让用户发送电子邮件作为参数,然后查询数据库以查看他们的链接是否已过期:
请求的链接查询: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()
与设置安全 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)
Secret 应该是一个长随机数,但每个应用程序只需要一个。min_version 可以是 DEFAULT_SIGNED_VALUE_VERSION(当前为 2)。
不要推出自己的解决方案。使用图书馆中的那个。在那里。有用。