昨天我安装了 Windows 8,现在我试图了解为什么我在访问本地存储时收到“拒绝访问”消息。该页面通过浏览器 (http://localhost) 在同一台 PC 上提供服务。我的感觉是 IE 10 中的安全设置之一是错误的,但我还没有弄清楚是哪一个。
触发错误的 JavaScript 代码行是:
if(window.localStorage.getItem('phone') == null)
该代码在最新版本的 Chrome 中运行良好。
昨天我安装了 Windows 8,现在我试图了解为什么我在访问本地存储时收到“拒绝访问”消息。该页面通过浏览器 (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
Generic Read-Write 时访问被拒绝。事实上,比这更糟糕的是:如果我删除container.dat
了,同样的 ACCESS DENIED 发生了,即使文件不再存在。而且,如果我删除了(隐藏的)DOMStore
文件夹,当 taskhost.exe 尝试重新创建它时,它也会收到 ACCESS DENIED。
在追了两天假线索之后,最终的解决办法是这样的:
注册表项:
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 存储”复选框。这应该可以解决问题
我将涉及的网站添加到 IE 的受信任站点部分,并且没有再次收到错误消息。
此问题也可能是由于注册表项丢失或损坏造成的。如果重置无法解决问题,LocalLow
文件夹具有正确的完整性级别,并且DOMStore
注册表值正确,请运行以下命令在配置文件中重新注册 IE:
32 位操作系统:
C:\WINDOWS\system32\ie4uinit.exe -BaseSettings
64 位操作系统:
C:\WINDOWS\system32\ie4uinit.exe -BaseSettings
C:\Windows\SysWOW64\ie4uinit.exe -BaseSettings
有关详细信息,请参阅IE MSDN 博客。
除了这里已经很好的答案之外,我想添加另一个观察结果。就我而言,Windows %LOCALAPPDATA% 目录结构上的 NTFS 权限以某种方式被破坏了。
诊断这个问题。我创建了一个新的 Windows 帐户(配置文件),它与 localStorage 配合得很好,所以我煞费苦心地遍历了各自的 %LOCALAPPDATA%\Microsoft\Internet Explorer 树寻找差异。
我发现了这个宝石:
C:\Users\User\AppData\Local\Microsoft>icacls "Internet Explorer"
Internet Explorer Everyone:(F)
我不知道权限是如何被广泛设置的!
更糟糕的是,所有子目录都关闭了所有权限。难怪 DOMStore 无法访问!
另一个帐户的工作权限是:
NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Administrators:(OI)(CI)(F)
my-pc\test:(OI)(CI)(F)
这与父目录的权限相匹配。
因此,出于懒惰,我通过将所有目录设置为“Internet Explorer”并继承权限来解决问题。正确的做法是手动应用每个权限,而不是依赖继承功能。但是如果您遇到此问题,需要检查的一件事是 %LOCALAPPDATA%\Microsoft\Internet Explorer 的 NTFS 权限。如果 DOMStore 的权限被破坏,所有访问 localStorage 的尝试都会遇到拒绝访问。