为什么Google会while(1);在其(私人)JSON响应前加上?
例如,这是在Google日历中打开和关闭日历时的响应:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Run Code Online (Sandbox Code Playgroud)
我认为这是为了防止人们eval()对它进行操作,但你真正需要做的就是更换while然后你就可以了.我认为eval预防是为了确保人们编写安全的JSON解析代码.
我已经在其他几个地方看到了这种情况,但谷歌(邮件,日历,通讯录等)的情况更是如此.奇怪的是,谷歌文档开始了&&&START&&&,谷歌联系人似乎开始while(1); &&&START&&&.
这里发生了什么?
为什么Json Request Behavior需要?
如果我想将HttpGet请求限制为我的操作,我可以使用该[HttpPost]属性修饰操作
例:
[HttpPost]
public JsonResult Foo()
{
return Json("Secrets");
}
// Instead of:
public JsonResult Foo()
{
return Json("Secrets", JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
为什么[HttpPost]不够?
为什么框架会JsonRequestBehavior.AllowGet为我们所拥有的每一个"捣乱"我们JsonResult.如果我想拒绝获取请求,我将添加该HttpPost属性.
我试图从WCF服务返回一些JSON.此服务只是从我的数据库返回一些内容.我可以得到数据.但是,我担心我的JSON格式.目前,返回的JSON格式如下:
{"d":"[{\"Age\":35,\"FirstName\":\"Peyton\",\"LastName\":\"Manning\"},{\"Age\":31,\"FirstName\":\"Drew\",\"LastName\":\"Brees\"},{\"Age\":29,\"FirstName\":\"Tony\",\"LastName\":\"Romo\"}]"}
Run Code Online (Sandbox Code Playgroud)
实际上,我希望我的JSON格式尽可能干净.我相信(我可能不正确),以干净的JSON表示的相同结果集合应该如下所示:
[{"Age":35,"FirstName":"Peyton","LastName":"Manning"},{"Age":31,"FirstName":"Drew","LastName":"Brees"},{"Age":29,"FirstName":"Tony","LastName":"Romo"}]
Run Code Online (Sandbox Code Playgroud)
我不知道"d"来自哪里.我也不知道为什么要插入转义字符.我的实体如下所示:
[DataContract]
public class Person
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public int Age { get; set; }
public Person(string firstName, string lastName, int age)
{
this.FirstName = firstName;
this.LastName = lastName;
this.Age = age;
}
}
Run Code Online (Sandbox Code Playgroud)
负责返回内容的服务定义为:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetResults()
{
List<Person> results = new List<Person>();
results.Add(new Person("Peyton", "Manning", …Run Code Online (Sandbox Code Playgroud) 最近我读了一些关于'JSON劫持'的文章,其中一些是在这里.
所以,我尝试在我的浏览器,Chrome 17(dev),Firefox 8和IE8上进行以下操作.
但我无法对(文字)JSON数据做任何事情.
"JSON劫持"问题是否都在现代浏览器上解决了?或者我该如何重现它?
在阅读有关如何避免json劫持的内容时,我遇到了各种方法,包括POST一切或预先响应,因此它们不是有效的JavaScript.
最常见的前置方式似乎是添加{} &&到对象或数组前面.Angular建议先用)]}',\n.
为什么棱角不使用更标准的{} &&方法?一个人不完全安全吗?在JavaScript中更难使用吗?除了角度之外,采用不那么受欢迎的方法是否有充分的理由?
json在Get方法中返回时,我遇到了以下 ASP.NET MVC 错误:
此请求已被阻止,因为在 GET 请求中使用此请求时,敏感信息可能会泄露给第三方网站。要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。
显然这个漏洞被称为json Hijacking。这篇文章解释了当json使用Get. 但是返回json一个Post方法是安全的。
为什么要改变Get以Post防止这种攻击?