设备检测不基于 UA

Device detection NOT based on UA

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

有大量的库可用于设备检测,但所有嗅探 User-Agent 都可以很容易地被伪造。是否有任何库超越 UA 并使用其他检查来确保设备确实是手持设备?

I'm looking to restrict the use of my webapp for handheld devices only, and completely disable for desktop.

放弃所有希望。这不可能。例如,"handheld" 上的 RDF 应用程序可以由单独的 "desktop" 计算机访问。即使访问被成功限制为 "handheld devices" 对设备硬件的访问,软件也可能会或可能不会同时受到限制,从而允许 "handheld" 操作系统、浏览器、显示器等在本地查看或远程 "desktop"。

adb 或非 android 平台的类似接口也可以访问 "real-time",或保存 htmljs 在 [=20 查看=] 设备 - 在 "desktop".

不确定是否有帮助,但我想分两部分解决您的问题:

I'm looking to restrict the use of my webapp for handheld devices only, and completely disable for desktop.

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

Is there any library that goes beyond UA and uses other checks to make sure the device is indeed a handheld?

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

  • User-Agent 嗅探
  • 特征检测
  • 设备检测

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

User-Agent嗅探

使用 "User-Agent Sniffing"(UA 嗅探),可以通过 查看 HTTP 中的 User-Agent header 来获取客户端的属性要求。 UA 嗅探通常涉及在 UA 字符串中搜索特定字符串或模式,并根据搜索结果做出选择。虽然 UA 嗅探可以在客户端上使用 JavaScript 完成本身,没有什么能阻止人们在服务器上执行 UA 嗅探。 UA 嗅探也有一些缺点。第一个是:走下坡路,不断更新您的网站和服务,以跟上浏览器和设备市场的 never-ending 发展。其次,UA也可以被伪造(正如你在post中提到的)。

特征检测

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

特征检测也有缺点。最致命的一种被称为“误报”。例如,您对浏览器的测试告诉您“是的,我支持此功能!开火!”,却发现实际上并不支持地理定位。

最常用的特征检测工具是Modernizr

设备检测

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

有些人倾向于将 UA-Sniffing 与设备检测混淆。公平地说,设备检测确实利用对 HTTP 请求(尤其是 User-Agent 字符串)的分析来进行操作。但相似之处到此为止。 fully-fledged 设备检测框架,例如 WURFL,将竭尽全力避免误报,最重要的是,它将 return 无法通过 UA 分析得出的设备属性和功能.

希望对您有所帮助

简而言之 - 服务器没有可靠的方法来判断哪些设备发起了与它的通信。 HTTP headers/content 中的所有内容都可以用最简单的脚本进行欺骗。

在客户端,事情甚至更加开放 - 自然地,可以以熟练的开发人员喜欢的任何方式查看、提取、操作、更改和使用任何客户端代码。

但是你可以尝试让黑客的日子更难过,我在客户端最好的办法是使用 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;

然后我会尽量减少所有内容,使其更难操纵和破解,因此希望普通用户不会打扰,或者不具备破解它的技能,并希望最好。