客户端用户代理检测is known to be bad和discouraged in favor of feature detection。但是,根据传入的 user agent field in a HTTP request?
做出不同反应也是不好的一个例子是根据传入的用户代理是移动还是桌面来发送更小或更大的图像。
答案 0 :(得分:18)
我认为这取决于你的动机是什么。例如,在移动网络领域,您尝试做的是为用户提供在其平台上看起来合理的内容。为什么要关注用户报告的用户代理,何时纯粹是为了自己的利益?如果他们努力用不同的用户代理欺骗你,那么他们是唯一受苦的人。当然,主要的麻烦是误报;它并不完全可靠。
我遵循的论点是你不应该依赖它,但移动开发人员受到这样的通用广泛声明的攻击。是的,有很好的选择,但是在你可以想象的每个浏览器中,当确定性开始降低时,这些信息在某些时候实际上是有用的。
对于任何纯文本标题,您当然不会使用它来促进访问控制。
当有更好的替代方案时,用户代理检测被认为是错误的,但将其包含在检测过程中肯定没有害处,这会在确定性方面优雅地降级。
我在整个过程中遇到的问题是我们在为用户提供合情合理的东西,但似乎从不认为在你不确定的时候可以接受。如果您不确定用户代理,为什么不问一次并存储?您可以使用用户代理作为指导。
因此,总结一下我的想法,基本上用户代理标头是不可靠的,因此依赖是不好的。这并不意味着您无法从中获取一定程度的有价值信息,而更可靠的选项会使您处于不确定状态。一般来说,断定它是坏的是错误的。这就是你使用这些信息做坏事与否的原因。
在看到您对问题的更新后,我有以下评论要做出贡献。 我想要嗅探图像请求并向客户端提供基于用户代理的图像吗?
如果这是唯一的变量,那么也许它可以起作用,但很少会出现这种情况,你唯一不同的就是图像。我不想检测每个请求,因为我想为客户端提供一致的解决方案。这意味着我为他们提供了一个页面,使他们能够请求正确的资源。该页面为所有集成资源提供了一个统一的解决方案。本文档中的所有变体都适用于特定视图。
我认为用户代理字符串在视图中变化的可能性非常小,似乎不值得担心。但是,采用此原则还可以减少执行浏览器/平台检测所需的次数,这只会是有益的。这使您可以更轻松地在客户端上切换视图。如果客户说实际上你看错了,我就是平板电脑而不是电话,你怎么去纠正?您为用户提供了更好的页面,否则您需要为您的图像请求欺骗标题......糟糕的主意。 请勿使用用户代理字符串来提供图片等常规资源。
平台识别是网络现代发展的一个非常活跃的领域。随着计算变得越来越普遍,平台变得越来越广泛,我们理解我们所服务的平台的需求也在增加。我认为在当前条件下这个问题的一般解决方案将落在指纹识别和统计分析上。
考虑这个应用程序 - akinator.com - 请注意来自大量稀疏数据的统计分析是如何令人烦恼地准确的。在有限的环境(一组浏览器配置)中,您可以想象我们可以向客户端的浏览器询问一些问题。然后,我们对某些n维特征空间中的响应进行统计分析。根据您找到的结果,使用user-agent作为此空间的维度将是有用且自我限制的。如果它在很大程度上是不准确的,那么它将会看到很大的差异,你从中获得的价值将是自我限制的。
当然,您从此统计模型中获取任何值的能力要求您能够获得一些经过验证的事实。例如,这可能是运行JavaScript测试套件来检测客户端js功能,或者实际上,在不确定性中,您实际上可以要求用户告诉您他们的平台是什么。
如需进一步阅读,我会向您推荐Mozilla的这篇文章
https://developer.mozilla.org/en/Browser_detection_using_the_user_agent
今天,寻找这些字符串是了解它的唯一方法 在服务之前,设备可以在移动设备(相应的平板电脑)上运行 HTML。
答案 1 :(得分:4)
取决于。使用user agent作为分支服务器级代码逻辑的唯一信号,最好是不确定且最不安全,但它可用于定义死记硬背特定类别的浏览器和服务内容的功能,以便在提供vanilla代理时满足他们的需求。
您勾勒出的情景就是一个完美的例子。尝试检测移动浏览器并缩小您在服务器级别发送给他们的内容完全合适,因为您正在尝试调整用户体验以更好地满足他们的需求(例如,通过提供更小的图像和更好的内容流以适应较小屏幕的限制),同时根据服务器的需求进行平衡(发送较小的图像,从而在线路上产生较少的负载和较少的带宽)。这个策略只需要改进。
您应该始终遵循一些设计原则,以确保您的用户不会将用户代理检测的做法视为可疑:
始终可以查看您网站的完整版本并相应地规划您的负载资料。否则,将让人们试图通过更改其代理来规避这一点。
在创建模态视图时,始终明确定义网站内容的修改。这将清除您可能或可能没有做出的任何FUD。
始终提供您网站备用版本的路径。例如,使用类似http://mobile.example.org
的内容将人员迁移到移动版本,进行设计级假设,即在请求此路径时,您的观众已明确要求 。 p>
奖励用户通过在内容和性能方面为他们提供更好的体验,为您提供正确的代理凭据。当您预期他们的需求并让他们在他们浏览的网站版本上获得更快的表现时,用户会更高兴。
避免滥用和手动重定向模式。例如,当您检测到他们正在运行iOS时,请不要使用移动应用程序的大型horking弹出广告阻止它们。 (不可否认,这是我的一个宠儿。)
从不以用户代理为基础限制对网站区域的访问(选择严格警告用户,如果他们脱离轨道并起草支持政策,哪些内容无效周围)。例如,我们中的许多人都深深地记得为“在Internet Explorer中效果最好”的网站更改我们的代理,而不允许其他所有浏览器。如果可以避免,你不应该成为这种不良行为的又一个例子。
简而言之:提供正确的用户代理是用户的决定。您可以使用它为用户选择运行客户普通香草或不知道的用户定义默认体验好点。这里的目标是奖励您的用户,不提供虚假的用户代理,为他们提供他们需要的选项和他们想要的体验,同时平衡他们的需求。超出的任何东西会导致他们犹豫不决,因此,应该被视为非常可疑。
您当然可以尝试检测浏览器by other means,但这仍然是一个开放式研究领域。浏览器功能和指纹在功能上竞争时会发生变化,并且尝试追赶以优化性能通常是难以处理的。
我同意this answer关于统计分析的使用,所以不要误解我的意思。但是,作为积极参与这一领域工作的人,我可以告诉你,没有任何神奇的子弹会给你完美的分类确定性。然而,启发式方法可以并且将帮助您更有效地平衡负载,为此,一旦您明确定义了可接受的错误率,浏览器审讯策略就可以并且确实对您有用。
答案 2 :(得分:2)
在“标准浏览器”场景中它不错但不可靠因为很多浏览器都为用户提供了一些配置选项/插件/修改的内容用户代理。
在这种情况下,我会实现类似于facebook的东西 - 它们基于UA(可能还有其他东西,也称为“指纹分析”)检测是否重定向到mobbile版本(即http://m.facebook.com/ ...)与否(即http://www.facebook.com ...)。同时,他们提供了一个URL参数m2w
,它覆盖了这种重定向机制。
根据移动运营商的不同,甚至可能会发生一些内容感知代理/缓存,这些代理/缓存可以即时扩展/重新压缩图像,并作为“正常”的borwser出现在您的终端......
考虑浏览器之外的场景......例如,如果您正在提供某些特定协议(如WebDAV),这可能是获得某种“平台特定”行为的唯一选择(例如OS X之间的差异)和Windows)。