我正在研究 CSRF 预防,我有一个关于返回 JSON 的 GET URL 的问题,以及该 URL 返回的数据是否可以通过第三方网页访问。
例如,假设这个请求
GET HTTP 1.1 /rest/foo.js
Host: myhost.com
返回动态生成的 JSON,如下所示,带有每个 session 的 CSRF token :
{user:"My name", userId:1234, CSRFToken: "EFB8765AC2134ACB23486"}
请注意,这是 不是 一个 JSONP 请求。现在,假设我在snekythirdparty.com 上有一个网页,内容如下:
<html>
<head>
<script language="javascript" src="http://myhost.com/rest/foo.js" />
</head>
...
</html>
我的问题是:脚本,Flash小程序或其他第三方网站页面中的任何其他内容(例如这个)是否可以读取foo.js的源代码以获取CSRF token ?
最佳答案
您不必隐藏您的 CSRF token
CSRF 保护的所有目的只是为了确保对您站点的请求确实来自您的站点(或您可以授予他们授权的其他站点)。
所以我真的不明白你想在你的例子中实现什么:
如果您想阻止 foo.js 从另一台服务器调用,您必须强制人们在请求该文件时发送 CSRF token ,然后您在服务器中检查该 token 是否实际匹配 session key ,例如之前设置的验证该用户的 session key 确实最初来自您的网站。
如果 json {user:"My name", userId:1234, CRSFToken: "EFB8765AC2134ACB23486"} 静态地写在这个javascript中,那么你误解了CSRF保护的所有概念。
您必须根据一些用户唯一数据(可以是数据库中的数据,可以是 session ID 等)动态创建 token ,然后在您的站点周围传递 token 并阻止对您想要保护的页面的请求,如果此 token 无效/存在。
CSRF 保护可以在常规形式和 ajax 调用中完成 - 就像你选择的那样
Good Explanation
关于javascript - 通过 <script> 标签加载到网页中的 JavaScript 文件的源可以被该页面中的其他 JavaScript 读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518957/