0

我正在使用 Google App Engine 执行以下操作:

用户单击页脚中的“给我发送电子邮件”按钮,该按钮使用以下代码将电子邮件表单加载到弹出式覆盖中:

$('#lightbox-overlay').load('/email #content')

“/email”在调度程序中设置为 Email.index,这是一个标准视图,输出 django 表单:

import os
import webapp2
import util
from models import EmailForm
from google.appengine.ext.webapp import template

class index(webapp2.RequestHandler):

    def get(self):
        html = "email.html"
        path = os.path.join(os.path.dirname(__file__), 'templates', html)
        self.response.headers ['Content-Type'] = 'text/html'
        self.response.write(template.render(path, {'form': EmailForm()}))

我想知道的是:除了这个 jQuery 请求,我可以让用户无法访问“/电子邮件”吗?用户能够访问我正在加载的弹出窗口之外的表单是没有意义的。

4

2 回答 2

2

如您所描述的,这是不可能的。但是,您可以生成不同的令牌并将其传递到 url,如 /email?token=xxx 并验证 xxx。如果用户尝试仅输入 /email 或带有旧令牌的 url,则会使其失败。

于 2013-10-31T23:54:08.193 回答
0

jquery AJAX 请求通常带有附加标头:

X-Requested-With: XMLHttpRequest

您可以尝试检测此标头,如果标头不存在则失败。就像是:

class index(webapp2.RequestHandler):

    def get(self):
        if self.request.headers.get("x_requested_with") == "XMLHttpRequest":
            # return email form
        else:
            # return failure.

请注意,这只是一种外观措施,它不是防黑客的。黑客可以很容易地伪造标题。

于 2013-11-01T15:55:38.893 回答