在提交数据的实验中,突然冒出一个这样的想法:在请求地址中与表单数据中同时添加同样的参数,并赋予不同的值,那么服务器获取参数时,究竟是取查询参数中的值,还是表单数据中的值?
以用户登录为例,假定登录地址为login,在查询参数中与表单数据中同时添加信息,代码如下:
// 已引入jQuery库
$.post('/params?username=yiifaa&password=yiifaa', {
username : 'yiifee',
password : 'yiifee'
}, function(datas) {
console.log(datas);
})
那么服务器端接收的username到底是yiifaa呢,还是yiifee呢?
首先查看浏览器提交的请求信息,发现浏览器将查询参数与表单数据都提交给了服务器,见下图:![查询参数与表单数据]
那么服务器端是怎么处理的呢?
如果通过request.getParameter()方法进行获取,我们发现,获取的值始终都为请求地址参数中的值,但如果用request.getParameterValues()方法进行获取,返回的值为String数组,且请求地址参数放在第一位,紧跟着才是表单数据中的值,服务端代码如下:
@RequestMapping(value = "/params", method = RequestMethod.POST)
public Map<String, String[]> params(HttpServletRequest request) {
// 总是获取到地址参数中的值
String username = request.getParameter("username");
// 可通过request.getParameterValues("username")获取所有的值
return request.getParameterMap();
}
最后服务器端的返回结果如下,说明查询参数与表单数据都是有效的赋值,只是优先级有差异:
{
"username":["yiifaa","yiifee"],
"password":["yiifaa","yiifee"]
}
结论
通过在查询参数中添加参数与赋值,可以覆盖表单中提交的数据信息,这是否又为XSS(跨站脚本攻击)打开了一扇窗呢?