【发布时间】:2014-08-14 19:06:52
【问题描述】:
我在我的应用程序中开发了一个反垃圾邮件时间陷阱(是的,我知道它不会 100% 有效,但它是一种权宜之计)这样做:
1) 加载页面时,使用 JavaScript 使用时间戳填充隐藏输入:
var timestamp = new Date().getTime() / 1000;
2) 当表单被 POST 时,使用 Python 视图检查这个时间戳与当前时间——如果自页面加载后不到 5 秒,则退回一个异常:
import datetime
feedback_timestamp = request.POST['feedback_timestamp'].strip()
current_timestamp = datetime.datetime.now().timestamp()
if current_timestamp - float(feedback_timestamp) < 5:
raise Exception("Submitted too quickly after loading!")
这在我的本地开发服务器上运行良好(即它会强制您等待 5 秒,否则它会引发异常)。然而,我注意到,一旦我将它加载到我的生产服务器上,时间戳之间就会相差大约 30 秒,即使我在加载后立即提交了表单。似乎 JavaScript 函数从本地用户获取时间,而 Python 代码从服务器获取时间,因此,如果它们不同步,它将无法正确触发。
我的问题是:如何从服务器而不是本地机器获取初始时间戳?是否有执行此操作的 JavaScript 函数?还是我需要使用 Python 后端填充隐藏的输入?
如果是后者,事情就有点复杂了,因为这一切都在我的 base.html 中完成,我的任何视图都不会直接加载它(即它用于扩展我使用的许多其他视图)。如何在不使用与页面关联的视图的情况下从 Python 后端提取值?
【问题讨论】:
-
为什么不在本地机器上同时拥有两个时间戳?还是两者都在服务器上?
标签: javascript jquery python django datetime