是否可以通过内容安全策略(CSP)限制对file://的不加限制的访问

时间:2019-02-02 14:22:04

标签: android cordova security w3c content-security-policy

我可以通过html中的Content-Security-Policy限制对不同资源的访问。但是,为了浏览file://,似乎允许文件在文件系统中的任何位置。

我尝试使用

<meta http-equiv="Content-Security-Policy" content="default-src 'none'">

当我使用file://path/to/myfile.html加载它并使用<a href="file:///var/log/system.log">System</a>时,我可以单击并查看系统日志的内容。

我的问题:是否可以将资源加载或导航仅限制于子文件夹而不是限制file:// url的文件系统上的所有内容?

我尝试使用Google Chrome版本71.0.3578.98 (Official Build) (64-bit) MacOS 10.12.6。

编辑:在Apache Cordova 8.1.2上提供以下真实案例:

使用cordova create HelloWorld创建新项目。然后编辑HelloWorld/www/index.html并添加<div><a href="file:///etc/hosts">System</a></div>

然后执行cordova platform add androidcordova run android。点击System链接,即使我将CSP更改为/etc/hosts(至少在我的无根手机上),也可以查看<meta http-equiv="Content-Security-Policy" content="default-src 'none'">

1 个答案:

答案 0 :(得分:2)

由于您尚未托管您的页面,因此该页面可以在 href 中使用,但是一旦将其托管在某个位置,您网站的实际网址将以 http开头: https:,而不是 file:然后使用CSP,默认情况下它将阻止文件系统。

当您打开本地创建的html时,浏览器只是将其读取为文件。检查chrome中的开发人员选项,然后查看“网络”标签,您将在下面看到以下内容:

  1. 没有HTTP响应,因为它只是作为文件读取,并且 服务器无法提供服务。
  2. 没有HTTP响应代码,它将显示为完成。
  3. HTTP响应标头告诉浏览器要限制和允许的内容。 (理想情况下,CSP应该在HTTP响应中发送并在托管服务器上进行配置)。 标签就像备用广告一样。

尝试托管您的网站,然后如果CSP限制了源,您将看到状态代码 403 或类似代码。

希望这可以消除您的疑问。