如何防止用户从本地保存的Html登录页面访问Web应用程序?

时间:2012-01-31 13:07:35

标签: javascript html web-applications desktop

我有一个很多非技术用户使用的Web应用程序。我发现其中一些用户正在将应用程序的登录页面保存到他们的桌面(这也保存了相关的CSS和JS文件)。然后,要开始使用该应用程序,他们双击该桌面图标,该图标使用file:// protocol显示本地副本。

这可能会在以后引起问题,例如:如果我更改登录表单,或者它发布的URL,等等。另外,某些javascript实用程序,例如PIE.htc无法使用file:// protocol。

显然他们应该做的是保存浏览器书签/收藏夹,我正在寻找一种方法来检测和警告这些用户而不会混淆其他用户。我一直在使用一些javascript来警告这些用户:

if (top.location.protocol == 'file:') {
    alert('This application is not designed to be accessed from a desktop copy...')
}

但是这只会警告用户已经保存了桌面副本,因为我添加了这段javascript。

有没有其他人遇到过这个问题,并提出了他们想要分享的聪明解决方案?

由于

更新

最后,我决定通过在登录页面请求时设置带有nonce值的cookie,并将相同的值存储为表单中的隐藏字段。然后,在表单提交处理程序中,检查两者是否相同,如果没有则显示错误消息。可以将nonce存储在会话中而不是cookie中,但我不想创建不必要的会话。

如果用户已在本地保存登录页面,则与cookie相比,保存表单中的nonce值可能会有不同(如果他们有cookie)。

通常,人们不会在登录表单中添加CSRF保护(这就是这个),但它符合我的要求。我在The Register上了解了这项技术,http://www.theregister.co.uk/2009/10/02/google_web_attack_protection/,Google为其登录表单实施了类似的保护,以防止伪造登录请求,http://en.wikipedia.org/wiki/Cross-site_request_forgery#Forging_login_requests

6 个答案:

答案 0 :(得分:2)

我认为您最好的选择是教育用户使用书签而不是保存物理文件。

除此之外,可能还有一种方法可以在登录时创建URL的快捷方式?

答案 1 :(得分:1)

您可以检查服务器端的http referrer,并警告用户不要来自您的托管登录表单。

编辑:

实际上,之前已经提出了一个模糊的类似问题,并且很好地解释了为什么引用者不是一个理想的解决方案,并提供了另一种解决方案:How to check if a request if coming from the same server or different server?

答案 2 :(得分:1)

也许是饼干?如果网站与file:\\一起运行,则请求中可能没有任何Cookie。 (当然,现在您应该在登录页面上添加一些cookie(会话数据)。

另外,请阅读CSRF http://en.wikipedia.org/wiki/Cross-site_request_forgery和防止方法。

答案 3 :(得分:1)

为什么,不是,而不是警报,将重定向放到您的页面上?

window.location = 'http://www.yourdomain.com'

或者您也可以使用window.location.reload();

强制重新加载

答案 4 :(得分:0)

您可以将用户重定向到具有登录表单的真实页面,而不是显示消息,或者显示帮助框,以解释用户应该以这种方式保存页面。

答案 5 :(得分:0)

您可以设置一个在表单中设置为隐藏变量的会话变量。如果不存在,则重定向到您的登录表单。