24時間のみ有効なリンクを作成したいのですが、これは検証を目的としているため、質問は簡単です。
このリンクを今回のみ有効にするにはどうすればよいですか。ヒントがあります:
- エポックタイムを取得します。
- 次の値のみを使用してリンクを作成します:something.com/time/1359380374
- ユーザーがリンクをクリックしたら、この値を抽出して比較します。
ハッシュ値について聞きましたか?なぜ?ハッシュ値から時間を取得できない(プロセスを反転する)ので、これはどのように行われますか?
24時間のみ有効なリンクを作成したいのですが、これは検証を目的としているため、質問は簡単です。
このリンクを今回のみ有効にするにはどうすればよいですか。ヒントがあります:
ハッシュ値について聞きましたか?なぜ?ハッシュ値から時間を取得できない(プロセスを反転する)ので、これはどのように行われますか?
あなたの最善の策は、ユーザーの電子メールを引数として送信し、データベースにクエリを実行して、リンクの有効期限が切れているかどうかを確認することです。
要求されたリンク クエリ:update users set locked_stamp = now();
リクエスト URL :http://yourdomain.com/?email=useremail
クエリ:select true from users where email = '$email' and locked_stamp > now()-interval 1 hour and now() limit 1
結果: 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()