1. 问题提出
看spring security官方文档中,有一段关于利用JSON进行CSRF攻击的描述:
一个常见的问题是“我需要保护由javascript发出的JSON请求吗?”答案是,这视情况而定。但是,您必须非常小心,因为有些CSRF漏洞会影响JSON请求。例如,恶意用户可以使用以下格式使用JSON创建CSRF:
<form action="https://bank.example.com/transfer" method="post" enctype="text/plain">
<input name='{"amount":100,"routingNumber":"evilsRoutingNumber","account":"evilsAccountNumber", "ignore_me":"' value='test"}' type='hidden'>
<input type="submit"
value="Win Money!"/>
</form>
这将产生以下JSON结构
{ "amount": 100,
"routingNumber": "evilsRoutingNumber",
"account": "evilsAccountNumber",
"ignore_me": "=test"
}
如果应用程序未验证Content-Type,则该应用程序将被暴露。根据设置的不同,仍然可以通过更新URL后缀以.json结尾来利用验证内容类型的Spring MVC应用程序,如下所示:
<form action="https://bank.example.com/transfer.json" method="post" enctype="text/plain">
<input name='{"amount":100,"routingNumber":"evilsRoutingNumber","account":"evilsAccountNumber", "ignore_me":"' value='test"}' type='hidden'>
<input type="submit"
value="Win Money!"/>
</form>
2. 具体问题
针对上述官方的描述,有两个问题想请教各位老师:
2.1 产生了如上述的JSON结构会造成什么问题?
这会有什么影响么?如果造成了原本想直接传递给后台的表单数据,变成了传递json,后台在接收参数、做参数解析的时候就会报错。为什么会涉及CSRF问题?
2.2 增加了Content-Type的JSON校验会有那些好处?
意思是原本只处理json数据的接口,增加校验后,将会拒绝处理其他数据类型么?但是如果接口传递的数据不是json类型的,在参数解析的时候也会报错啊?增加这个校验的必要性是?