两者似乎都允许您通过HTTP响应头白名单来批准未被篡改的网页所包含的资源的来源。我唯一能看出的区别是CSP似乎在您可以批准的HTTP响应中更加细致。
CORS允许对域名放宽同源策略。
例如,通常情况下,如果用户同时登录example.com
和example.org
,同源策略会阻止example.com
向example.org/current_user/full_user_details
发出AJAX请求并获取响应的权限。
这是Web的默认策略,可以防止用户在同时登录多个站点时泄露数据。
现在,有了CORS,example.org
可以设置一个策略,表示它将允许来自AJAX的https://example.com
来源读取响应。如果example.com
和example.org
由同一公司运营,并且希望在用户的浏览器中允许这些来源之间共享数据,则可以执行此操作。它只影响客户端,而不影响服务器端。
CORS允许站点A授权站点B读取(可能是私有的)来自站点A的数据(使用访问者的浏览器和凭据)。
CSP允许网站防止它自己从意外来源(例如,作为防御XSS的措施)加载(可能是恶意的)内容。
网站A阻止数据被发送到网站B
-> 浏览器无法执行 GET[其他动词] A
。以及 网站B阻止网站A读取其数据
-> 浏览器无法执行 POST B <一些数据>
? - mathk以下是JodySowald的简明评论:
内容安全策略(CSP)会阻止对外部资源的调用,跨源资源共享(CORS)会阻止来自外部来源的调用。举个例子,在
example.com
中展示example.net
的iframe,example.com
不能使用其CSP设置阻止example.net
,而example.net
也不能使用其CORS设置阻止example.com
。
原始回答:
上面的回答没有给出CSP和CORS之间的清晰而简洁的区别。以下是我的思考方式:
假设我们有一个想要发送请求到example.net
的example.com
网站。
example.com
时,example.com
服务器返回example.com
HTTP响应,此响应中的CSP限制可以防止浏览器中的example.com
向example.net
发出请求。example.com
HTTP响应中没有CSP限制,则浏览器中的example.com
可以向example.net
发送请求。example.net
服务器会响应example.net
HTTP 响应,响应中的CORS限制可能会阻止浏览器中的example.com
加载它。(请注意,默认情况下,Same-origin policy将限制响应的加载,除非通过CORS另有规定)example.com
,而同源策略(缺少CORS)则保护了example.net
。CORS检查与第三方的授权以使用其服务。因此,第三方提供或拒绝授权。
例如,如果www.example.com
中的页面需要向www.example.org
发出请求,则浏览器发送一个具有Origin: www.example.com
的OPTIONS
请求作为请求授权的前置条件。现在,www.example.org
提供或拒绝授权。
CSP通过指定可以从哪里加载特定类型的内容来防止网页不经意地从第三方加载恶意内容。因此,例如,您可以使用指令为以下每个脚本、CSS、媒体等提供有效的源。
示例:
Content-Security-Policy: default-src 'none'; script-src 'self' www.google-analytics.com ajax.googleapis.com; connect-src 'self'; img-src 'self'; style-src 'self';
一种响应头,告诉浏览器只允许特定来源访问您的内容,例如:
Access-Control-Allow-Origin: https://onlinebanking.example.com
CORS是2004年发明的,它不会阻止您的内容与陌生人交流并使用*
进行回复,因此自2013年以来我们有:
一种响应头,告诉浏览器只允许从特定来源访问内容:
Content-Security-Policy: default-src https://onlinebanking.example.com
这也可以通过HTML进行设置或收紧:
<meta
http-equiv="Content-Security-Policy"
content="default-src https://onlinebanking.example.com" />