Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why have "while(1);" in XmlHttpRequest response? [duplicate]

Why does Google prepend while(1); to their (private) JSON responses?

For example, here's a response while turning a calendar on and off in Google Calendar:

while (1); [   ['u', [     ['smsSentFlag', 'false'],     ['hideInvitations', 'false'],     ['remindOnRespondedEventsOnly', 'true'],     ['hideInvitations_remindOnRespondedEventsOnly', 'false_true'],     ['Calendar ID stripped for privacy', 'false'],     ['smsVerifiedFlag', 'true']   ]] ] 

I would assume this is to prevent people from doing an eval() on it, but all you'd really have to do is replace the while and then you'd be set. I would assume the eval prevention is to make sure people write safe JSON parsing code.

I've seen this used in a couple of other places, too, but a lot more so with Google (Mail, Calendar, Contacts, etc.) Strangely enough, Google Docs starts with &&&START&&& instead, and Google Contacts seems to start with while(1); &&&START&&&.

What's going on here?

like image 876
Jess Avatar asked Apr 19 '10 18:04

Jess


1 Answers

It prevents JSON hijacking, a major JSON security issue that is formally fixed in all major browsers since 2011 with ECMAScript 5.

Contrived example: say Google has a URL like mail.google.com/json?action=inbox which returns the first 50 messages of your inbox in JSON format. Evil websites on other domains can't make AJAX requests to get this data due to the same-origin policy, but they can include the URL via a <script> tag. The URL is visited with your cookies, and by overriding the global array constructor or accessor methods they can have a method called whenever an object (array or hash) attribute is set, allowing them to read the JSON content.

The while(1); or &&&BLAH&&& prevents this: an AJAX request at mail.google.com will have full access to the text content, and can strip it away. But a <script> tag insertion blindly executes the JavaScript without any processing, resulting in either an infinite loop or a syntax error.

This does not address the issue of cross-site request forgery.

like image 131
rjh Avatar answered Oct 13 '22 00:10

rjh