state参数如何阻止CSRF攻击

时间:2017-04-27 06:30:37

标签: oauth

OAuth 2.0 page的页面中说明如下: state(推荐)应用程序使用state参数来存储特定于请求的数据和/或防止CSRF攻击。授权服务器必须将未修改的状态值返回给应用程序。

但我不清楚国家如何防止CSRF攻击。对于我的想法,如果有人抓住了pakage,那肯定是请求查询参数也已知,所以他可以再次发回它以淡化这个响应。

1 个答案:

答案 0 :(得分:0)

常见的方法是将state存储在用户的会话中(如果存在),或者将其设置在安全的httponly cookie中(如果应用程序是无状态的)。然后在回调函数中比较那些(查询中的state和会话/ cookie中的function detectHistoryChange(handler) { document.head.appendChild(document.createElement('script')).text = '(' + function () { // injected DOM script is not a content script anymore, // it can modify objects and functions of the page var _pushState = history.pushState; history.pushState = function (state, title, url) { _pushState.call(this, state, title, url); window.dispatchEvent(new CustomEvent('state-changed', { detail: state })); }; // repeat the above for replaceState too } + ')(); $(this).remove();'; // remove the DOM script element // And here content script listens to our DOM script custom events window.addEventListener('state-changed', function (e) { console.log('History state changed', e.detail, location.hash); handler(); }); }

如果说“package”只是指HTTP流量(中间人攻击),那么如果你使用的是HTTPS协议 - 什么都不能被劫持。这就是为什么强烈建议仅通过HTTPS使用OAuth。