domain1
Controller 中的action
:
def show
respond_to do |format|
format.html
format.js { render js: 'alert("Foo")' }
end
end
当我在我的 domain2
View 中调用获取此 js
格式时,警报有效。
<script type="text/javascript" src="http://domain1/action.js"></script>
但是,由于 domain1
提供了 js 脚本
,我原以为它不会工作。
我认为这是一个跨域请求。我错了吗?
我如何在 Rails 中阻止它(使用 cors - 我不考虑身份验证)?
请求 header :
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:language=en; JSESSIONID=548BBE8340E2BCF88CC79FD406D87201; _session_id=36e9c1d96dd60d139edc669e4eb5311a
Host:domain1
If-None-Match:"4160518da6c411ed4f844684e3bd82e8"
Referer:https://domain2/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
响应头:
Cache-Control:max-age=0, private, must-revalidate
Content-Length:13
Content-Security-Policy:default-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline' 'unsafe-eval'; font-src * 'unsafe-inline' 'unsafe-eval'; frame-src * 'unsafe-inline' 'unsafe-eval'; img-src * 'unsafe-inline' 'unsafe-eval' data:; media-src * 'unsafe-inline' 'unsafe-eval'; object-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; style-src * 'unsafe-inline' 'unsafe-eval';
Content-Type:text/javascript; charset=utf-8
Date:Thu, 02 Jul 2015 14:36:17 GMT
Etag:"68a0bef3fb4d7408f31dfd3d2958cb4d"
Server:WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
Strict-Transport-Security:max-age=631138519
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Request-Id:136ef12c007055e756e4ac1b7de83046
X-Runtime:0.264848
X-Ua-Compatible:IE=Edge
X-Xss-Protection:1
最佳答案
您可以包含来自任何域的代码,这就是像谷歌地图这样的库的工作方式。
在 JavaScript 中您不能做的是向其他域发出 (XMLHTTP) 请求,除非这些域具有允许您的域的源策略。
包括脚本不被视为跨域请求(这也是 JSONP 绕过来源限制的方式)。输出 CORS 策略不会停止请求。
关于如何阻止请求。这取决于你的情况。如果您将脚本作为 API 套件的一部分提供,最好的办法是使用身份验证 token 。
关于javascript - 如何阻止跨域脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187903/