设备检测不基于UA

时间:2015-06-29 23:34:52

标签: javascript device user-agent

我希望仅限制我的webapp用于手持设备,并完全禁用桌面设备。

有大量的库可用于设备检测,但所有嗅探用户代理都很容易伪造。是否有任何库超出UA并使用其他检查来确保设备确实是掌上电脑?

3 个答案:

答案 0 :(得分:6)

不确定它是否有用,但我想分两个部分提出您的问题:

  

我希望限制将我的webapp用于手持设备   仅限,并完全禁用桌面。

嗯,由于@ guest271314(和其他评论)提到的原因,这在技术上是不可行的。此外,有许多软件应用程序,其唯一任务是模拟桌面设备上的移动环境,并且几乎所有软件应用程序都使用UA嗅探。回到第二个查询,

  

是否有任何库超越UA 使用其他检查来制作   确定该设备确实是手持设备?

如果您想了解访问服务的浏览器和设备的性质,可以采用以下几种方法来完成此任务:

  • 用户代理嗅探
  • 特征检测
  • 设备检测

现在不幸的是,有些人有时会混淆这些。然而,发现HTTP客户端属性的每种方法都有不同的工作方式,最重要的是,它们通常在技术堆栈中扮演不同的角色。

用户代理嗅探

使用" User-Agent Sniffing" (UA Sniffing),可以通过查看HTTP请求中的User-Agent头来派生客户端的属性。 UA嗅探通常涉及在UA字符串中搜索特定的字符串或模式,并根据搜索结果做出选择。虽然UA嗅探可以通过客户端本身的JavaScript完成,但没有什么能阻止人们执行UA在服务器上嗅探。 UA嗅闻也有一些垮台。首先是:沿着不断更新您的站点和服务的滑坡,跟随浏览器和设备市场的永无止境的发展。其次,UA也可以伪造(正如你在帖子中提到的那样)。

功能检测

我们不测试User-Agent字符串的方法,而是测试浏览器声称支持的功能。特征检测是关于使用JavaScript检查浏览器的某些功能或特征。查看查询的上下文,这是您可能正在寻找的内容。

特征检测也有缺点。最致命的一种叫做“误报”。例如,您对浏览器的测试告诉您“是的,我支持此功能!消防!“,只是发现Geolocation并不真正受到支持。

最常见的功能检测工具是Modernizr

设备检测

设备检测是指拥有一个框架,将HTTP请求映射到移动设备属性的完整配置文件,包括与浏览器和操作系统相关的属性。它通常发生在服务器上,并且具有仅发送客户端可以轻松解析并用于浏览器的内容和格式的附加优势。

有些人倾向于将UA-Sniffing与设备检测混淆。为了公平起见,设备检测确实利用HTTP请求的分析(特别是用户代理字符串)来进行操作。但相似之处到此为止。一个完善的设备检测框架,例如WURFL,将避免误报,最重要的是,它将返回无法通过UA分析得出的设备属性和功能。

希望有所帮助

答案 1 :(得分:1)

  

我希望将我的webapp用于手持设备   仅限,并完全禁用桌面。

放弃所有希望。这是不可能的。例如,“掌上电脑”中的RDF应用程序可以由单独的“桌面”计算机访问。即使访问被成功限制为“手持设备”访问设备硬件,也可以或可以不同时限制软件,允许在本地或远程查看“手持”操作系统,浏览器,显示器等“桌面”。

adb,或非Android平台的类似界面也可以访问“实时”,或者在“手持”设备上查看保存htmljs - 在“桌面”

答案 2 :(得分:0)

简而言之 - 服务器无法确定哪些设备启动与之通信的可靠方式。使用最简单的脚本可以欺骗HTTP标头/内容中的所有内容。

在客户端,事情变得更加开放 - 当然,任何客户端代码都可以以技术熟练的开发人员所希望的任何方式查看,提取,操作,更改和使用。

但是你可以尝试让黑客的生活更加困难,我在客户端的最佳镜头是使用Javascript和Modernizr进行一些检查以检测触摸设备,然后尝试区分这些和支持的桌面设备触摸。

所以:

1)仅通过Modernizr.touch检测触控设备,此处提供文档:http://modernizr.com/docs/ 它是客户端javascript来检测触摸设备。

2)为了排除桌面,我会测试设备宽度是否小于1024(javascript:screen.width)。大多数手持设备都是这样的。

3)也许这个例外的唯一受欢迎的例外是iPad。它们具有1024px的设备宽度,就像一些支持触摸的桌面一样。在这种情况下,您可以在客户端使用用户代理检查(比在HTTP中发送到服务器但仍然可能的用户代理更难欺骗)

isiPad = navigator.userAgent.match(/iPad/i) != null;

然后我最小化所有内容以使其更难以操纵和破解,因此普通用户希望不会打扰,或者没有获得打破这一点的技能,并希望最好的。