EnableCors 如何限制源站访问
Posted
技术标签:
【中文标题】EnableCors 如何限制源站访问【英文标题】:How does EnableCors restrict the origin access 【发布时间】:2018-02-28 03:21:24 【问题描述】:我已经创建了一个如下的 WebAPI 控制器
[EnableCors("http://localhost:1234", "*", "*"]
public class DummyController : ApiController
public string GetDummy()
return "Iam not DUMMY";
当我使用托管在locahost:5678
上的应用程序中的 ajax 访问服务时,它会抛出错误,因为它是不允许的,但是当我从像 PostMan 这样的 restclient 访问相同的 API 时,它会返回数据。
问题
1) CORS 只限制 ajax 请求而不是普通的 HTTP 请求,因为我相信邮递员会发送普通的 http 请求。
2) EnableCors 如何限制提供的来源?考虑如果我修改 ajax 请求中的 origin and referrer
参数,我可以获取这些值。 CORS 使用什么策略来识别引荐来源网址。
由于 W3C 声明 HttpReferrer 可以轻松修改,因此不应依赖其值来授权访问。如果是这样的话,EnableCors 会在后面签入以授权来源。
我也可以在 ajax 请求中更改我的来源。请帮我解决这个问题我很困惑
【问题讨论】:
【参考方案1】:CORS 只限制 ajax 请求而不是普通的 HTTP 请求,因为我相信邮递员会发送普通的 http 请求。
是的,特别是浏览器限制 Ajax 请求——也就是说,默认情况下,浏览器不允许前端 javascript 代码访问使用 XMLHttpRequest、Fetch API 或 Ajax 发出的跨域请求的响应JavaScript 库中的方法。
服务器本身不会对跨域请求实施任何限制;相反,服务器会向任何向它们发出请求的客户端发送响应,包括邮递员——也包括浏览器。
浏览器本身总是能得到任何其他客户端会得到的响应;但仅仅因为浏览器获得响应并不意味着浏览器将允许前端 JavaScript 代码访问该响应。如果响应包含Access-Control-Allow-Origin
标头,浏览器只会向前端代码公开对跨域请求的响应。
EnableCors 如何限制提供的来源?
没有。当您为服务器启用 CORS 时,唯一的效果是使服务器根据接收到的特定请求标头的值发送额外的响应标头 - 特别是 Origin
请求标头。
考虑如果我修改 ajax 请求中的
origin and referrer
参数,我可以获取这些值。 CORS 使用什么策略来识别引荐来源网址。
服务器不会(也不能)对Origin
值进行任何验证,以确认它没有被欺骗或其他什么。但 CORS 协议不需要服务器来执行此操作——因为所有 CORS 执行都是由浏览器完成的。
由于 W3C 声明 HttpReferrer 可以轻松修改,因此不应依赖其值来授权访问。如果是这样的话,EnableCors 会在后面签入以授权来源。
我也可以在 ajax 请求中更改我的来源。请帮我解决这个问题,我很困惑
浏览器知道发送跨域请求的任何前端代码的真实来源,并且浏览器会根据他们知道的请求的真实来源进行 CORS 检查,而不是检查值Origin
标头。
浏览器是设置 Origin
请求标头并首先通过网络发送它;他们根据他们所知道的真实来源设置Origin
值,而不是为自己使用 - 因为他们已经知道来源是什么,并且该值是他们内部使用的。
因此,即使您设法更改请求的 Origin
标头,这对浏览器来说也无关紧要 - 它会忽略该值并继续检查真实来源。
cf. 答案在 In the respective of security, is it meaningful to allow CORS for specific domains?
【讨论】:
以上是关于EnableCors 如何限制源站访问的主要内容,如果未能解决你的问题,请参考以下文章