我在启用OPcache的PHP 5.5.28上使用Symfony v3.0.6。站点管理员的安全性由FOSUserBundle管理。
网站用户访问的页面在同一域的iframe中以非Symfony形式显示给他们,这些表单向简单的Symfony动作发出AJAX请求:
public function validateAction(MailingList $mailingList, Request $request)
{
$email = $request->get('email');
$code = $request->get('code');
if ($mailingList->getCode() == $code) {
$response = new Response('', 200);
$securityManager = $this->get('security_manager');
$securityManager->grantAccess($request->getSession(), $mailingList, $email);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$responseFailed = new Response('N2', 401);
$responseFailed->headers->set('Access-Control-Allow-Origin', '*');
return $responseFailed;
}
如您所见,我调用了我的自定义服务SecurityManager,在其中向会话添加了一个属性:
public function grantAccess(Session $session, MailingList $mailingList, $email) {
$session->set('page_'.$mailingList->getId(),
json_encode(array(
0 => hash('sha256', $email.$mailingList->getCode()),
1 => $email
))
);
}
AJAX调用成功,并且整个页面被重新加载 window.reload()
重新加载后,Symfony调试工具栏不会显示任何在上一个“请求”中设置的属性的迹象。我也曾尝试使用Cookies,但没有成功。仍然存在相同的模式。
问题已解决,且简短的课程-请勿使用iframe或框架。曾经。
<iframe>
和主页具有单独的PHP会话(已检查会话ID)。因此,越野车的过程看起来像这样:
<iframe>
<iframe>
会话中的属性window.reload()
)。重要的提示!
某些较旧的浏览器或新的浏览器,但安全/隐私设置不太严格,可能会将相同的会话用于主页和<iframe>
。
这就是为什么我花了这么长时间才找到该bug的主要原因。看起来代码的行为不一致。
删除之后,使用>iframe>
该代码就像是一种魅力。
谢谢大家的想法。希望这可以为将来的其他程序员节省一些时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句