What is the deployment configuration? What wsgi server and what web server?
Craig Younkins On Tue, Jul 24, 2012 at 5:55 PM, Massimo Di Pierro < massimo.dipie...@gmail.com> wrote: > Is there an open issue about this? If not, can you open one with more > details? > > > On Tuesday, 24 July 2012 16:31:52 UTC-5, howesc wrote: > >> one other scenario...... >> >> i reported a few months back that running web2py on GAE with python2.7 >> and multi-threading had odd behaviors with the globals (request, response, >> session). i have yet tracked down the issues i was having (might have been >> a coding error on my part).....but if you are using GAE + multithreading >> i'd be interested to know that. >> >> cfh >> >> On Tuesday, July 24, 2012 1:26:21 PM UTC-7, Massimo Di Pierro wrote: >>> >>> Perhaps it would be safe to block access to the site if request.client >>> is "unknown". >>> I think we should change web2py to block access to any web2py app if >>> request.client does not validate as an IP address. >>> >>> Massimo >>> >>> On Tuesday, 24 July 2012 15:24:06 UTC-5, Massimo Di Pierro wrote: >>>> >>>> Here is a possible cause of the problem although I am not sure. >>>> There are two possible issues which may conspire to create this problem. >>>> >>>> Issue #1 >>>> ======= >>>> >>>> There is a session file in the app you sent me called: >>>> >>>> unknown-c4571a37... >>>> >>>> session files should be >>>> >>>> <ip>-..... >>>> >>>> This means that one of the HEADERS http_x_forwarded_for or remote_addr >>>> has a value "unknown". >>>> >>>> A first google search retuned: >>>> http://nixforums.org/**about154671-Hacking-X-**Forwarded-For.html<http://nixforums.org/about154671-Hacking-X-Forwarded-For.html> >>>> which opens the possibility the the web server, in your case nginx, is >>>> not finding the client ip address (how is that possible) and setting it to >>>> unknown. This should never happen. The client_addr is a required field for >>>> WSGI. >>>> >>>> This could be the result of a hacking attempt but it would required >>>> both parties doing the hacking for the sessions to be mixed up. >>>> >>>> Issue #2 >>>> ======= >>>> >>>> There is a bug with may prevent urandom from working: >>>> >>>> http://community.webfaction.**com/questions/9333/** >>>> importerror-cannot-import-**name-urandom<http://community.webfaction.com/questions/9333/importerror-cannot-import-name-urandom> >>>> http://stackoverflow.com/**questions/10776797/error-when-** >>>> importing-wsgihandler-with-**django<http://stackoverflow.com/questions/10776797/error-when-importing-wsgihandler-with-django> >>>> >>>> Can you check if you can import urandom on your version of python on >>>> webfaction? >>>> >>>> >>>> It is therefore theoretically possible that, given the concurrency >>>> model of nginx, if two users visit the site very close to each other, with >>>> urandom missing, both declaring the same incorrect client ip (unknown), >>>> they get assigned the same session id. This is because web2py has no way of >>>> distinguishing the two users and lacks a proper random number generator. >>>> >>>> TODO: >>>> >>>> 1) check if you can import urandom >>>> 2) try understand how it possible to have an "unkown" client_addr in >>>> the http headers. >>>> >>>> My google search returned nothing about 2. Has anybody ever seen this >>>> before? >>>> Please let us know. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Tuesday, 24 July 2012 14:50:04 UTC-5, Massimo Di Pierro wrote: >>>>> >>>>> Nothing stands out from your code. It is very good code. You have >>>>> changed to gluon/tools.py but I do not think they can be causing this >>>>> problem. >>>>> >>>>> On Tuesday, 24 July 2012 14:48:16 UTC-5, Massimo Di Pierro wrote: >>>>>> >>>>>> I should add that the conflict I mentioned below is not possible >>>>>> unless there is a proxy in between. That is because the session id >>>>>> includes >>>>>> the client IP. >>>>>> >>>>>> I really do not see how this problem can be possible. Are you sure >>>>>> they are not playing a prank on you? If they share a facebook page >>>>>> perhaps >>>>>> they know each other. I have to ask but we will keep investigating the >>>>>> issue very seriously nevertheless. >>>>>> >>>>>> For now I suggest you add this to your code: >>>>>> >>>>>> if auth.user: >>>>>> session.clients = session.clients or [] >>>>>> if not request.client in session.clients: session.clients.append(* >>>>>> *request.client) >>>>>> if len(session.clients)>1: print auth.user.email, session.clients >>>>>> >>>>>> log the output and check how often you have multiple session.clients >>>>>> for the same email from different network top level domains (xxx.*.*.*) >>>>>> If >>>>>> you do, email the user and check what is going on with them. >>>>>> >>>>>> Massimo >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Tuesday, 24 July 2012 14:26:35 UTC-5, Massimo Di Pierro wrote: >>>>>>> >>>>>>> The only time I have seen something like this was long age. Web2py >>>>>>> was running on replicated VMs behing a load balancer. If two requests >>>>>>> from >>>>>>> new users arrived within a short time frame (do not remember if a >>>>>>> millisecond or a second), they were assigned the same session uuid >>>>>>> because >>>>>>> uuid.uuid4() could not discriminate between the VMs. We fixed it by make >>>>>>> uuid dependent on the os entropy source urandom and initializing it >>>>>>> differently on different VMs using the IP address. The fix works on >>>>>>> linux/unix but not on Windows. Replicated windows machine may suffer >>>>>>> from >>>>>>> this problem still. >>>>>>> >>>>>>> What is the web server and configuration in your case? >>>>>>> Do you know what was the link that caused the problem? >>>>>>> Which page she was directed too? >>>>>>> >>>>>>> massimo >>>>>>> >>>>>>> On Tuesday, 24 July 2012 10:18:46 UTC-5, Jonathan Lundell wrote: >>>>>>>> >>>>>>>> On 24 Jul 2012, at 6:41 AM, Neil wrote: >>>>>>>> >>>>>>>> Good point about trunk. There are some features that I liked and >>>>>>>> got used to, but nothing essential. >>>>>>>> >>>>>>>> I'll try to summarize any relevant settings in the hope that >>>>>>>> someone can spot something. >>>>>>>> >>>>>>>> In 0.py I have: >>>>>>>> >>>>>>>> ... >>>>>>>> settings.login_method = 'local' >>>>>>>> settings.login_config = '' >>>>>>>> ... >>>>>>>> >>>>>>>> in db.py: >>>>>>>> >>>>>>>> ... >>>>>>>> auth = Auth(db, hmac_key=Auth.get_or_create_**key()) >>>>>>>> crud, service, plugins = Crud(db), Service(), PluginManager() >>>>>>>> auth.define_tables() >>>>>>>> db.auth_user.last_name.**requires = None >>>>>>>> auth.settings.actions_**disabled.append('register') >>>>>>>> auth.settings.registration_**requires_verification = False >>>>>>>> auth.settings.registration_**requires_approval = True >>>>>>>> auth.settings.reset_password_**requires_verification = False >>>>>>>> auth.settings.login_next = URL("social_anxiety", "user_main") >>>>>>>> auth.settings.logout_next = URL("default", "index") >>>>>>>> ... >>>>>>>> >>>>>>>> and in default.py: >>>>>>>> >>>>>>>> >>>>>>>> def index(): >>>>>>>> session.forget(response) >>>>>>>> if auth.is_logged_in(): >>>>>>>> redirect(URL(c='social_**anxiety', f='user_main')) >>>>>>>> else: >>>>>>>> return dict() >>>>>>>> >>>>>>>> def user(): >>>>>>>> if request.args(0) == 'register': >>>>>>>> db.auth_user.first_name.commen**t = '(or an anonymous user >>>>>>>> name)' >>>>>>>> elif request.args(0) == 'profile': >>>>>>>> redirect(URL(c='default', f='user_profile')) >>>>>>>> >>>>>>>> return dict(form = auth()) >>>>>>>> >>>>>>>> and in layout.html to create the navbar: >>>>>>>> >>>>>>>> {{try:}} >>>>>>>> {{=auth.navbar(referrer_**actions=None)}} >>>>>>>> {{except:pass}} >>>>>>>> >>>>>>>> Anything stand out? In particular, anything that would apply one >>>>>>>> user's session to another user on a different computer? >>>>>>>> >>>>>>>> Now that I look at it, "session.forget" >>>>>>>> in application/default/index seems like a bad idea. I put it in to see >>>>>>>> if I >>>>>>>> could speed up the main page and kind of forgot about it... Just >>>>>>>> removed it. >>>>>>>> >>>>>>>> >>>>>>>> That jumped out at me too, but it's not obvious how it could result >>>>>>>> in the reported symptom. >>>>>>>> >>>>>>>> Does the forget() call affect the is_logged_in() call one way or >>>>>>>> the other? Even if it did, in order to appear logged in as user X, a >>>>>>>> browser would have to present a cookie with session id of a user X >>>>>>>> session. >>>>>>>> How could that happen? Weird. >>>>>>>> >>>>>>>> >>>>>>>> Neil >>>>>>>> >>>>>>>> >>>>>>>> On Tuesday, July 24, 2012 2:11:25 PM UTC+1, Richard wrote: >>>>>>>>> >>>>>>>>> For sure using trunk is not very safe in production environnement, >>>>>>>>> not because it not secure, but because sometimes things brake when new >>>>>>>>> features are added. If you don't need edge feature, better to stick >>>>>>>>> with >>>>>>>>> stable. >>>>>>>>> >>>>>>>>> For the problem you describe, I think if you show us the way you >>>>>>>>> activate auth could help. I mean it is not just a matter of using >>>>>>>>> decorator... >>>>>>>>> >>>>>>>>> I am not the best one to help you fix this issue, but if you give >>>>>>>>> us more information like what's in you db.py and all the auth setting >>>>>>>>> you >>>>>>>>> set, I am sure there is more knowledge users that will be kind and >>>>>>>>> will >>>>>>>>> help. >>>>>>>>> >>>>>>>>> Richard >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, Jul 24, 2012 at 8:18 AM, Neil: >>>>>>>>> >>>>>>>>>> I just heard from someone who had never been to my site before. >>>>>>>>>> When she visited (on her phone), it was already logged on as another >>>>>>>>>> user. >>>>>>>>>> This other user (she told me his name) is located on the other side >>>>>>>>>> of the >>>>>>>>>> world, and may or may not have logged out. I'm rather worried - she >>>>>>>>>> was >>>>>>>>>> accessing functions decorated with @auth.requires_login() without >>>>>>>>>> even >>>>>>>>>> having an account, let alone logging in! Once she clicked "logout" >>>>>>>>>> she was >>>>>>>>>> no longer able to access any user pages. >>>>>>>>>> >>>>>>>>>> I understand this will be tough to debug with so little >>>>>>>>>> information. Furthermore, I've never observed this behaviour >>>>>>>>>> personally. >>>>>>>>>> However, it's concerning enough that I thought I'd see if anyone else >>>>>>>>>> has experienced such a thing. If not, any ideas how such a thing >>>>>>>>>> could even >>>>>>>>>> happen? >>>>>>>>>> >>>>>>>>>> I'm using trunk - I suppose I should roll back to stable? >>>>>>>>>> >>>>>>>>>> Neil >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> -- >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>> On Tuesday, 24 July 2012 14:50:04 UTC-5, Massimo Di Pierro wrote: >>>>> >>>>> Nothing stands out from your code. It is very good code. You have >>>>> changed to gluon/tools.py but I do not think they can be causing this >>>>> problem. >>>>> >>>>> On Tuesday, 24 July 2012 14:48:16 UTC-5, Massimo Di Pierro wrote: >>>>>> >>>>>> I should add that the conflict I mentioned below is not possible >>>>>> unless there is a proxy in between. That is because the session id >>>>>> includes >>>>>> the client IP. >>>>>> >>>>>> I really do not see how this problem can be possible. Are you sure >>>>>> they are not playing a prank on you? If they share a facebook page >>>>>> perhaps >>>>>> they know each other. I have to ask but we will keep investigating the >>>>>> issue very seriously nevertheless. >>>>>> >>>>>> For now I suggest you add this to your code: >>>>>> >>>>>> if auth.user: >>>>>> session.clients = session.clients or [] >>>>>> if not request.client in session.clients: session.clients.append(* >>>>>> *request.client) >>>>>> if len(session.clients)>1: print auth.user.email, session.clients >>>>>> >>>>>> log the output and check how often you have multiple session.clients >>>>>> for the same email from different network top level domains (xxx.*.*.*) >>>>>> If >>>>>> you do, email the user and check what is going on with them. >>>>>> >>>>>> Massimo >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Tuesday, 24 July 2012 14:26:35 UTC-5, Massimo Di Pierro wrote: >>>>>>> >>>>>>> The only time I have seen something like this was long age. Web2py >>>>>>> was running on replicated VMs behing a load balancer. If two requests >>>>>>> from >>>>>>> new users arrived within a short time frame (do not remember if a >>>>>>> millisecond or a second), they were assigned the same session uuid >>>>>>> because >>>>>>> uuid.uuid4() could not discriminate between the VMs. We fixed it by make >>>>>>> uuid dependent on the os entropy source urandom and initializing it >>>>>>> differently on different VMs using the IP address. The fix works on >>>>>>> linux/unix but not on Windows. Replicated windows machine may suffer >>>>>>> from >>>>>>> this problem still. >>>>>>> >>>>>>> What is the web server and configuration in your case? >>>>>>> Do you know what was the link that caused the problem? >>>>>>> Which page she was directed too? >>>>>>> >>>>>>> massimo >>>>>>> >>>>>>> On Tuesday, 24 July 2012 10:18:46 UTC-5, Jonathan Lundell wrote: >>>>>>>> >>>>>>>> On 24 Jul 2012, at 6:41 AM, Neil wrote: >>>>>>>> >>>>>>>> Good point about trunk. There are some features that I liked and >>>>>>>> got used to, but nothing essential. >>>>>>>> >>>>>>>> I'll try to summarize any relevant settings in the hope that >>>>>>>> someone can spot something. >>>>>>>> >>>>>>>> In 0.py I have: >>>>>>>> >>>>>>>> ... >>>>>>>> settings.login_method = 'local' >>>>>>>> settings.login_config = '' >>>>>>>> ... >>>>>>>> >>>>>>>> in db.py: >>>>>>>> >>>>>>>> ... >>>>>>>> auth = Auth(db, hmac_key=Auth.get_or_create_**key()) >>>>>>>> crud, service, plugins = Crud(db), Service(), PluginManager() >>>>>>>> auth.define_tables() >>>>>>>> db.auth_user.last_name.**requires = None >>>>>>>> auth.settings.actions_**disabled.append('register') >>>>>>>> auth.settings.registration_**requires_verification = False >>>>>>>> auth.settings.registration_**requires_approval = True >>>>>>>> auth.settings.reset_password_**requires_verification = False >>>>>>>> auth.settings.login_next = URL("social_anxiety", "user_main") >>>>>>>> auth.settings.logout_next = URL("default", "index") >>>>>>>> ... >>>>>>>> >>>>>>>> and in default.py: >>>>>>>> >>>>>>>> >>>>>>>> def index(): >>>>>>>> session.forget(response) >>>>>>>> if auth.is_logged_in(): >>>>>>>> redirect(URL(c='social_**anxiety', f='user_main')) >>>>>>>> else: >>>>>>>> return dict() >>>>>>>> >>>>>>>> def user(): >>>>>>>> if request.args(0) == 'register': >>>>>>>> db.auth_user.first_name.commen**t = '(or an anonymous user >>>>>>>> name)' >>>>>>>> elif request.args(0) == 'profile': >>>>>>>> redirect(URL(c='default', f='user_profile')) >>>>>>>> >>>>>>>> return dict(form = auth()) >>>>>>>> >>>>>>>> and in layout.html to create the navbar: >>>>>>>> >>>>>>>> {{try:}} >>>>>>>> {{=auth.navbar(referrer_**actions=None)}} >>>>>>>> {{except:pass}} >>>>>>>> >>>>>>>> Anything stand out? In particular, anything that would apply one >>>>>>>> user's session to another user on a different computer? >>>>>>>> >>>>>>>> Now that I look at it, "session.forget" >>>>>>>> in application/default/index seems like a bad idea. I put it in to see >>>>>>>> if I >>>>>>>> could speed up the main page and kind of forgot about it... Just >>>>>>>> removed it. >>>>>>>> >>>>>>>> >>>>>>>> That jumped out at me too, but it's not obvious how it could result >>>>>>>> in the reported symptom. >>>>>>>> >>>>>>>> Does the forget() call affect the is_logged_in() call one way or >>>>>>>> the other? Even if it did, in order to appear logged in as user X, a >>>>>>>> browser would have to present a cookie with session id of a user X >>>>>>>> session. >>>>>>>> How could that happen? Weird. >>>>>>>> >>>>>>>> >>>>>>>> Neil >>>>>>>> >>>>>>>> >>>>>>>> On Tuesday, July 24, 2012 2:11:25 PM UTC+1, Richard wrote: >>>>>>>>> >>>>>>>>> For sure using trunk is not very safe in production environnement, >>>>>>>>> not because it not secure, but because sometimes things brake when new >>>>>>>>> features are added. If you don't need edge feature, better to stick >>>>>>>>> with >>>>>>>>> stable. >>>>>>>>> >>>>>>>>> For the problem you describe, I think if you show us the way you >>>>>>>>> activate auth could help. I mean it is not just a matter of using >>>>>>>>> decorator... >>>>>>>>> >>>>>>>>> I am not the best one to help you fix this issue, but if you give >>>>>>>>> us more information like what's in you db.py and all the auth setting >>>>>>>>> you >>>>>>>>> set, I am sure there is more knowledge users that will be kind and >>>>>>>>> will >>>>>>>>> help. >>>>>>>>> >>>>>>>>> Richard >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, Jul 24, 2012 at 8:18 AM, Neil: >>>>>>>>> >>>>>>>>>> I just heard from someone who had never been to my site before. >>>>>>>>>> When she visited (on her phone), it was already logged on as another >>>>>>>>>> user. >>>>>>>>>> This other user (she told me his name) is located on the other side >>>>>>>>>> of the >>>>>>>>>> world, and may or may not have logged out. I'm rather worried - she >>>>>>>>>> was >>>>>>>>>> accessing functions decorated with @auth.requires_login() without >>>>>>>>>> even >>>>>>>>>> having an account, let alone logging in! Once she clicked "logout" >>>>>>>>>> she was >>>>>>>>>> no longer able to access any user pages. >>>>>>>>>> >>>>>>>>>> I understand this will be tough to debug with so little >>>>>>>>>> information. Furthermore, I've never observed this behaviour >>>>>>>>>> personally. >>>>>>>>>> However, it's concerning enough that I thought I'd see if anyone else >>>>>>>>>> has experienced such a thing. If not, any ideas how such a thing >>>>>>>>>> could even >>>>>>>>>> happen? >>>>>>>>>> >>>>>>>>>> I'm using trunk - I suppose I should roll back to stable? >>>>>>>>>> >>>>>>>>>> Neil >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> -- >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- > > > > --