#5782: Auth.redirect session value lost when linking from external site.
-----------------------------------------------------+----------------------
    Reporter:  pearj                                 |          Type:  Bug    
      Status:  new                                   |      Priority:  Medium 
   Milestone:  1.2.x.x                               |     Component:  General
     Version:  RC3                                   |      Severity:  Normal 
    Keywords:  session login Auth.redirect external  |   Php_version:  PHP 5  
Cake_version:                                        |  
-----------------------------------------------------+----------------------
 On http://locahost/test.html
 I have a link to:
 http://127.0.0.1/cmhr/websites/browse/11/Drug_and_alcohol
 cmhr is where cakephp is installed.
 [[BR]][[BR]]
 The websites controller is using the Auth component so then user is
 redirected to an authentication page, but during the process the session
 is lost again and cakephp no longer knows where it's supposed to redirect
 to because Auth.redirect is gone so it redirects to the HTTP_REFERER which
 is http://locahost/test.html after the user logs in.
 [[BR]][[BR]]
 I did extensive debugging both using a PHP debugger, wireshark and reading
 the php source code for sessions and I found out some interesting things.
 [[BR]][[BR]]
 1. Go to http://locahost/test.html
 [[BR]][[BR]]
 2. Click on http://127.0.0.1/cmhr/websites/browse/11/Drug_and_alcohol
 (with session cookie CAKEPHP=750c5ad36000dc5c773b3419e922aff1) Referer:
 http://localhost/test.html
 [[BR]][[BR]]
 3. Cake php saves /websites/browse/11/Drug_and_alcohol into Auth.redirect
 and sends a HTTP redirect (HTTP 1/1 302 Found, with Location header) to
 http://127.0.0.1/cmhr/users/login (Server sets Session cookie
 CAKEPHP=1f537fb5f5a1cdb3065920f05b128314)
 [[BR]][[BR]]
 4. Browser requests http://127.0.0.1/cmhr/users/login (with session cookie
 CAKEPHP=1f537fb5f5a1cdb3065920f05b128314) Referer:
 http://localhost/test.html
 [[BR]][[BR]]
 5. Server sends back login page amd saves http://localhost/test.html into
 Auth.redirect (Server sets Session cookie
 CAKEPHP=5ee7d212148b93f5ca6c343808b9690d)
 [[BR]][[BR]]
 6. Browser posts response to http://127.0.0.1/cmhr/users/login (with
 session cookie CAKEPHP=5ee7d212148b93f5ca6c343808b9690d) Referer:
 http://127.0.0.1/cmhr/users/login
 [[BR]][[BR]]
 7. Server (CakePHP) sends back HTTP redirect to http://locahost/test.html
 [[BR]][[BR]]
 And the user is back where they started.
 [[BR]][[BR]]
 If you look above you'll notice that on step 5 php has changed the session
 key and because it did that the original Auth.redirect was lost, so when
 cakephp realises that it decides to use the http referer instead which
 happens to be the external website.
 [[BR]][[BR]]
 I also verified this bug on book.cakephp.org, if you create a link from an
 external site eg http://localhost/test.html to
 http://book.cakephp.org/edit/526/How-it-Works you should be presented with
 a login box, and then after you login you will be redirected where you
 came from.  I confirmed this with my delicious account too.  Eg I
 bookmarked http://book.cakephp.org/edit/526/How-it-Works and then click on
 the link, logged in and was redirected back to delicious.
 [[BR]][[BR]]
 You can confirm this bug by simply clicking on
 http://book.cakephp.org/edit/526/How-it-Works right here in trac logging
 in, and you should be redirected back here.
 [[BR]][[BR]]
 I tried all sorts of things, but couldn't get around it, and in the end I
 went as far as read php source code.
 In ext/session/session.c I found the following comment:

 {{{

  /* check whether the current request was referred to by
        an external site which invalidates the previously found id */
 }}}

 Which explains why the session changes on steps 3 and 5.
 [[BR]][[BR]]
 So to retain the Auth.redirect we have to work around php killing the
 sessions.
 [[BR]][[BR]]
 I had 3 ideas off the top of my head:
 [[BR]][[BR]]
 1. We set an auth_redirect cookie when we detect that the referer hostname
 is different to currrent hostname.  But the problem with this is that we
 then loose the session flash message that says "You are not authorized to
 access that location." or whatever is in $this->authError.  But we could
 probably get around it easily enough by adding the authError message back
 in when we see the auth_redirect cookie.
 [[BR]][[BR]]
 2. We append the auth redirect to the login url, ie:
 users/login?authRedirect=/edit/526/How-it-Works.  This would probably be
 more reliable especially if cookies are disabled, but it doesn't look as
 good.  I don't think you would need the ?authRedirect in the form action
 because the auth component could just add authRedirect back into the
 session when the browser requests the login page after it sends the 302
 redirect.
 [[BR]][[BR]]
 3. Remove the http_referer, unfortunately I tried this and it didn't seem
 to work for me.  It seems that php can still get access to the
 http_referer even if we unset it from $_SERVER.

-- 
Ticket URL: <https://trac.cakephp.org/ticket/5782>
CakePHP : The Rapid Development Framework for PHP <https://trac.cakephp.org/>
Cake is a rapid development framework for PHP which uses commonly known design 
patterns like ActiveRecord, Association Data Mapping, Front Controller and MVC. 
Our primary goal is to provide a structured framework that enables PHP users at 
all levels to rapidly develop robust web applications, without any loss to 
flexibility.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"tickets cakephp" group.
To post to this group, send email to tickets-cakephp@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/tickets-cakephp?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to