网站检查用户是否已安装客户端应用程序的最佳方法是什么?
假设我有一个网站,如果客户端已安装并登录到桌面应用程序,则该网站可以更好地运行。我希望能够做两件事:
- 如果他们尚未安装该应用程序,请更改网站(以便他们轻松找到安装程序的链接)
- 如果他们已在几台计算机上安装了该应用程序,请确定他们正在从哪台计算机上浏览
我想要在任何主要浏览器上都可以在Windows和OSX上运行的功能。 Linux是一个奖励。
一些想法:
- 网站可以检测我们是否安装了Flash。它是如何工作的,并且可以用于我的两个目标?
- 我可以让客户端在本地主机上提供HTTP服务,并执行一些JavaScript请求来获取本地ID吗?我知道Google桌面搜索在某一时刻做了类似的事情。这是标准做法吗?
谢谢!
解决方案
我们可以拥有一个可以与应用程序进行通信的浏览器插件(用于IE的activex或者用于其余浏览器的Netscape插件)。加载网页后,它可以尝试实例化该插件,如果成功,则可以将其用作应用程序的代理。如果失败,则说明未安装该应用程序或者该用户明确禁用了该插件。无论哪种方式,网站都应相应地降低其功能。
更新:忘记回答问题:
- Flash正是通过这种方式做到的。 Flash是由网页创建的浏览器插件。
- 我们可以在应用程序/插件安装时生成一个机器ID,并且插件可以在创建网页时将该机器ID传递给网页。
关于使用本地Web服务器的主题:
主要出于安全考虑,我将远离拥有本地Web服务器的位置。要确保本地Web服务器被充分锁定,并且没有其他恶意网站可以利用它来代表自己进行处理的XSS漏洞,需要进行大量的工作。
另外,拥有网络服务器意味着它或者必须作为系统级进程运行,或者如果它以用户身份运行,则即使只有多个用户可以登录,也可以使网站仅与一个用户的应用程序实例进行交互。并同时运行它。
Google桌面搜索同时受到XSS安全漏洞(尽管它们已修复)和仅一用户能够在计算机上使用它的局限性的困扰(我不知道他们是否已解决此问题,尽管他们确实有可能解决) 。
如果我们可以为桌面应用程序选择开发环境,请从Adobe中检查AIR。它使我们可以使用html / javascript,Flash或者Flex开发桌面应用程序。
它具有API调用,我们可以从基于浏览器的Flash应用程序中使用API来查看是否已安装基于桌面的AIR应用程序,什么版本等。我们甚至可以启动它,并将参数从Web应用程序传递到桌面应用程序。
http://www.rogue-development.com/blog2/2008/03/interacting-with-an-air-app-from-a-browser-based-app/
我们可以从桌面应用程序注册协议(请参阅此)。例如,这可以用于打开网站中包含来自网站的任意数据的桌面应用程序。然后,我们可以让桌面应用将HTTP请求发送到网络服务器,告诉它我们在哪台计算机上。
Websites can detect if you've got Flash installed.
实际上,我相信浏览器可以检测到我们是否已为浏览器安装了Flash插件,并且网页可以提供浏览器可以选择的"已安装"和"未安装"选项。
否则,我们正在通过在网页中放置一些代码来寻求一种能够分析用户家用计算机并将其学到的东西报告给网站的方法。
你能说重大安全漏洞吗?
"网站可以检测到我们是否安装了Flash。它是如何工作的,是否可以用于我的两个目标?"这很简单,浏览器尝试渲染一些其他文件,并使用某些特定格式(例如Flash) .swf和我的浏览器找不到安装,否则将开始下载,或者我们可以选择下载该程序。
Flash也使用AC_RunActiveContent.js,请看一下这个js,人们通常将其放在他们的网页上
if (AC_FL_RunContent == 0) { alert("This page requires AC_RunActiveContent.js."); } else { AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave cabs/flash swflash.cab#version=8,0,0,0','width','981','height','635','id','build5','align','middle','src','build5','quality','high','bgcolor','#ffffff','name','build5','allowscriptaccess','sameDomain','allowfullscreen','false','pluginspage','http://www.macromedia.com/go/getflashplayer','movie','build5' ); //end AC code }