【问题标题】:Cross (sub)domain ajax form submit with captcha使用验证码提交跨(子)域 ajax 表单
【发布时间】:2011-08-13 23:36:33
【问题描述】:

我遇到了以下问题。前端网站 (www.domain.com) 用于填写属于后端 (backend.domain.com) 的表单。此表单受验证码保护,验证码的参考值保存在用户会话中(在 PHP 中)。

提交应该是基于 Ajax 的,这会给跨域带来一些问题。因此在 www.domain.com 上写了一个小的 PHP 代理。这个代理请求后端的形式。当用户提交表单时,会向代理发出 Ajax 请求,代理向后端发送验证请求并返回结果。

除了在用户会话中保存引用的验证码之外,所有这些都运行良好。由于前端网站向后端提交表单,后端会为前端使用一个会话。

解决此问题的最佳方法是什么?我想出了2种方法。第一个是在表单(散列)中包含验证码的引用,这样就不需要会话。另一种方法是使用 iframe 直接从后端包含表单。第二种方法可能会很好用,但感觉真的很难看。对于这种情况,您有什么建议?

更新:描述情况的序列图:

Client                  www.domain.com   backend.domain.com
  |                            |                   |
  |-------visit site---------->|                   |
  |                            |-----get form----->|
  |                            |<----return form---|
  |<------return form----------|                   |
  |                            |                   |
  |-------submit form--------->|                   |
  |                            |-----submit form-->|
  |                            |<----send reply----|
  |<------captcha failed-------|                   |
  v                            v                   v

【问题讨论】:

    标签: php ajax session cross-domain captcha


    【解决方案1】:

    感觉像是 cookie(或会话编号)问题。为会话设置的 cookie 对 www 站点有效,但对后端站点无效。但是既然所有的通信都是通过你的前端进行的,你能不能不用前端站点来做授权?

    Client                  www.domain.com   backend.domain.com
      |                            |                   |
      |-------visit site---------->|                   |
      |                            |--get login form-->|
      |                            |<----return form---|
      |                            |set cookie         |
      |<-return login form+cookie--|                   |
      |                            |                   |
      |----submit login form------>|                   |
      |                            |-----submit form-->|
      |                            |                   |check cookie
      |                            |<----send reply----|
      |<------captcha failed-------|                   |
      v                            v                   v
    

    www 站点必须设置 cookie,因为它正在与客户端通信,但后端会检查它 - 因为 cookie 是为不同的域设置的,所以后端无法访问它。解决方案:www 应该读取 cookie 并将 cookie 数据转发到后端进行处理。

    【讨论】:

    • 序列图不完全正确,我用描述情况的序列图更新了我的问题。但你是对的,这是一个 cookie/会话数问题。
    • @Intru 更新了答案,希望能有所收获。
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多