使用验证码进行交叉(子)域ajax表单提交

时间:2011-04-27 15:36:27

标签: php ajax session cross-domain captcha

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

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

除了在用户会话中保存引用的验证码之外,所有这些都很有效。由于前端网站将表单提交给后端,后端将使用会话进行前端。

解决此问题的最佳方法是什么?我想出了两种方法。第一种方法是在表单(散列)中包含验证码的引用,这样就不需要任何会话。另一种方法是使用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

1 个答案:

答案 0 :(得分: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数据转发到后端进行处理。