昨天我安装了 Windows 8,现在正在尝试了解为什么在访问 localstorage 时收到“拒绝访问”消息。该页面与浏览器 (http://localhost) 在同一台 PC 上提供。我的感觉是 IE 10 中的安全设置之一是错误的,但我还没有弄清楚是哪一个。
触发错误的 JavaScript 代码行是:
if(window.localStorage.getItem('phone') == null)
该代码在最新版本的 Chrome 中运行良好。
昨天我安装了 Windows 8,现在正在尝试了解为什么在访问 localstorage 时收到“拒绝访问”消息。该页面与浏览器 (http://localhost) 在同一台 PC 上提供。我的感觉是 IE 10 中的安全设置之一是错误的,但我还没有弄清楚是哪一个。
触发错误的 JavaScript 代码行是:
if(window.localStorage.getItem('phone') == null)
该代码在最新版本的 Chrome 中运行良好。
我们的用户在使用带有 IE 10 的 Windows 8 上使用 LocalStorage 功能(包括 Twitter)的网站时遇到问题。在打开 F12 开发人员工具的情况下访问这些网站之一时,SCRIPT5: Access is denied
控制台上会出现一条消息。
在与 Microsoft 支持人员合作后,我们确定了原因。结果是C:\Users\username\Appdata\LocalLow
他们用户配置文件中文件夹的设置有问题。
您计算机上的每个文件夹都有一个完整性设置。有关此设置用途的更多信息,请访问:http : //msdn.microsoft.com/en-us/library/bb625964.aspx
AppData\LocalLow
每个用户配置文件中文件夹(及其子文件夹)的完整性设置应该设置为“低”(因此得名)。在我们的例子中,此文件夹的完整性级别设置不正确。要解决此问题,请在命令提示符窗口中运行以下命令:
icacls %userprofile%\Appdata\LocalLow /t /setintegritylevel (OI)(CI)L
(如果计算机上有多个用户帐户并且其他用户遇到相同问题,则需要在每个受影响用户的帐户下运行该命令。)
至于这个设置最初是如何改变的?在我们的案例中,它是由我们部署到工作站的自定义 Windows 8 映像中的问题引起的。对于其他遇到问题的人,我的研究表明使用“系统清理器”实用程序可能是罪魁祸首。
毫无疑问,相同症状的原因可能有很多,但这里是为我解决这个问题的方法。
我只有许多装有 IE11 的 Windows 7 PC 中的一台,在尝试任何涉及window.localStorage
其他信誉良好且行为良好的网站的JavaScript 时都表现出“拒绝访问”的症状。Process Explorer 的使用表明,当 taskhost.exe(代表 Internet Explorer)试图打开DOMStore\container.dat
通用读写时,最接近的原因是 ACCESS DENIED 。事实上,更糟糕的是:如果我删除了container.dat
,同样的 ACCESS DENIED 发生了,甚至通过文件不再存在。而且,如果我删除了(隐藏的)DOMStore
文件夹,当 taskhost.exe 尝试重新创建它时,它也会收到拒绝访问。
在追了两天假线索之后,最终的解决方案是这样的:
注册表项:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\LowCache\Extensible Cache\DOMStore\CachePath
(请注意该LowCache
字符串中的 )被错误地设置为:
%USERPROFILE%\AppData\Local\Microsoft\Internet Explorer\DOMStore
什么时候应该是:
%USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\DOMStore
结果是低完整性 localStorage 请求被定向到 AppData 磁盘存储的中等完整性区域,从而产生 ACCESS DENIED 错误,并终止 JavaScript 的使用window.localStorage
。
这个注册表项多年来一定是错误的:也许是热情接受有缺陷的平台预览等的副作用。此错误在彻底删除并重新安装 IE11 后仍然存在。
中等完整性缓存有一个类似的注册表项:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache\Extensible Cache\DOMStore\CachePath
正确地保留为:
%USERPROFILE%\AppData\Local\Microsoft\Internet Explorer\DOMStore
并且不应更改。
尝试在 IE 设置中的高级选项卡下的安全子列表中启用增强保护模式。这将启用 Microsoft XSS 过滤器。我在登录 SE 和获取 google+ 通知时遇到了类似的问题,我的第一个解决方法是使用管理员权限启动 IE。但我认为 EP 模式也可以解决您的问题。
相关链接:了解增强保护模式
Mark Russinovich 总是说:“如有疑问,请使用Process Monitor ”:
localStorage 数据存储在以下文件夹中的 XML 文件中:C:\Users\[USERNAME]\AppData\Local\Microsoft\Internet Explorer\DOMStore
重现问题时的文件活动配置文件可以告诉您问题是由缺少文件访问权限还是由防病毒程序引起的。
我可以通过将只读属性添加到“DOMStore\container.dat”来重现错误。您应该检查所有文件/文件夹权限和属性是否设置正确。在我的机器上,管理员和我自己的帐户对提到的文件夹具有完全权限。
转到工具/Internet 选项/高级,然后在“安全”下选择“启用 DOM 存储”复选框。这应该可以解决问题