http - 为什么同源策略不阻止 POST 请求?
问题描述
我了解始终允许跨域、“简单”请求,例如 GET 和 POST(但您无法查看响应),并且如果您的浏览器支持 CORS,则 PUT/DELETE 会被阻止或预检。
我知道,只要响应被阻止,允许发送 GET 请求是无害的,因为 GET 请求应该是安全/幂等的(如果不是,那是开发人员没有使他们的 API ReSTful 的错)。
我也从这个答案中了解到,GET 和 POST 是用户发出的典型/有意请求,例如在 URL 文本框中输入内容或单击按钮发布表单时。
但是为什么浏览器会允许使用 xhr 的跨域 POST 请求呢?
那么,如果用户可以通过单击按钮来发布表单来进行有意的 POST 请求呢?允许 javascript 发送 POST 请求是灾难的根源,任何加载的恶意页面都可能在幕后执行跨域 POST 请求。
为什么浏览器没有从一开始就阻止这一点?
如果他们这样做了,那么现在 CORS 已经存在,POST 请求可以像 PUT/DELETE 一样进行预检,并且您会遇到更少的 xsrf 攻击。
解决方案
消除使用能力POST
将大大降低 Web 应用程序的功能,而不会显着提高安全性。
如果没有POST
,就无法请求另一个域修改数据。(请记住,这是在 CORS 提供选择加入跨域请求的方法之前。)这消除了所有有用的 Web 应用程序。(或者,更有可能的是,Web 应用程序会通过滥用来解决这个问题GET
。)
而你不会因为这种牺牲而得到太多回报。任何可能受到跨域 XHR 损害的服务器POST
都必须有 CSRF 保护来处理来自表单的跨域攻击POST
。而这样的防御(比如需要一个特殊的令牌)对两者同样有效。
推荐阅读
- reactjs - CKEditorError: ckeditor-duplicated-modules: 某些 CKEditor 5 模块重复
- r - 运行 R Shiny 应用程序时出现“需要 TRUE/FALSE 的缺失值”
- arduino-ide - 任务看门狗被触发。/abort() 在核心 0 上的 PC 0x400de07b 被调用
- asp.net-mvc - 将表单数组数据一次保存到 AspnetCore MVC 中的数据库中
- vb.net - 当一个drawing.point在里面时Arraylist访问x和y
- javascript - 使用 Jest 获取 React 应用程序中的断言总数
- android - onGenericMotionEvent() 不起作用 - 为什么?
- c++ - 我的变量“n”自己递减,甚至没有提供递减操作。C++ - N_Queen_Problem 程序
- postgresql - 创建独特的字符变化数组 postgres
- jenkins - 如何获取 Jenkins 构建的开始和结束时间?