当我使用谷歌浏览器发出AJAX POST请求时,我在服务器端获得了额外的空参数“_”。
以下是一些背景信息:
例如简单:
>>print sorted(request.POST.keys())
['_','my_parameter']
我用谷歌搜索过,我发现邮件列表中的帖子很少提到同样的问题,但我找不到答案为什么会发生这种情况。有人使用PHP和Safari报告相同的问题,所以我不认为它与服务器/后端相关。我用Firefox测试了同一页面,但我没有得到额外的参数。
我检查了HTTP 1.1规范,找不到任何相关内容。
奇怪的是我之前从未注意过这种行为。
我还没有编写一个单独的测试来测试它在所有现代浏览器上,我虽然我先问这里。我希望Safari可能会出现同样的问题。
一个小问题;是不好的做法,期望浏览器只发布我期望的参数,或者浏览器有可能发布不必要的/意外的参数,例如在这种情况下。
正如Blixt所说,问题出现在原型中:
if (params = Object.toQueryString(params)) {
if (this.method == 'get')
this.url += (this.url.include('?') ? '&' : '?') + params;
else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
params += '&_=';
}
找到it in bug tracker。看起来这在Safari端修复了,但它仍然在原型代码中作为解决方法。
答案 0 :(得分:3)
最有可能的是,空参数来自您的JavaScript框架。通常,框架会添加一个额外的参数(以使URL唯一),以防止某些浏览器(换句话说,Internet Explorer)缓存请求。
我从未体验过任何浏览器自行添加其他查询参数。
答案 1 :(得分:2)
请使用Fiddler跟踪Chrome浏览器与服务器之间的HTTP流量。您是否在HTTP请求中找到了附加参数?
答案 2 :(得分:1)
回答这个问题:
一个小问题;是不是很糟糕 练习期望浏览器会 只发布我的参数 期待或有机会 浏览器将发布 不必要的/意外的参数 在这种情况下。
信任来自不受信任来源的输入并且互联网上的用户代理是不受信任的来源是一个坏主意。
你应该假设你可以收到:
您还应该假设您可能没有收到预期的参数。