限制站点仅访问 QR 扫描
Posted
技术标签:
【中文标题】限制站点仅访问 QR 扫描【英文标题】:Restrict site access to QR scans only 【发布时间】:2022-01-23 11:45:09 【问题描述】:我已经看到一些关于确保网站访问来自 QR 码扫描的问题,但它们似乎专注于分析目的(跟踪流量来自何处),而我的兴趣是安全/隐私。
我想设置一个只有在扫描提供的二维码时才能访问的站点。换句话说,我不希望 QR 码拥有的 URL 只能手动输入/粘贴以通过其他方式访问站点。
我一直在谷歌上搜索这个问题,但没有任何运气。我正在想办法通过引用 URL 或其他方式来确保通过实际扫描提供的 QR 码来确保有人到达该站点。
编辑:该解决方案还需要独立于扫描仪(即我不能强制用户下载和使用特定的 QR 扫描仪应用程序)和跨平台(android + ios + WinMo + BlackBerry 等)。
现在我将问题提交给你们这些好人。
【问题讨论】:
我觉得你可以在二维码的URL中添加一些参数。 这是不可能的。您可以随时复制 URL 并分享它。 您不一定需要参数。相反,获取访问网站的设备的 Header,并确保它仅来自可以扫描 QR 码的设备:手机、平板电脑等。这本质上就像设置一个移动网站。不是万无一失,但我认为没有万无一失的方法。 @Kacey:带网络摄像头的电脑,... @str:这就是为什么我说要获取 Header 信息。当然,有人可以更改他们浏览器的 Header 信息,但这也是我说这不是万无一失的原因。 【参考方案1】:我们公司也有同样的情况。我们提供如下链接:
zxing://scan/?ret=http%3A%2F%2Ffoo.com%2Fproducts%2F%7BCODE%7D%2Fdescription&SCAN_FORMATS=UPC_A,EAN_13
其中 CODE 是在 QRCode 中返回的代码。所以你可以做的是创建一个像上面这样的 url(查看更多信息以获取链接)。然后在二维码里面放一个加密的数据,所以只有这个url被用户点击了,二维码的数据是正确的。人们可以继续访问您的网站。这样,如果 qrcode 泄露,他们将不知道该站点。如果他们知道该站点,代码就会被加密。
如果人们通过点击您的网站来扫描条形码。 zxing 将打开一个新的浏览器,其中包含扫描代码的 URL 和 CODE。
但是,人们确实需要来自 android 或 iphone 的条码扫描器。
更多信息:
zxing download / homepage zXing scanning from w【讨论】:
听起来很有希望,虽然我不熟悉斑马线,所以我必须深入研究你提供的研究。感谢您的回复,您清楚地理解了我的要求! 用上面的链接创建一个href。下载扫描仪。制作二维码,工作不做。单击链接,扫描仪将打开,用户将被重定向到给定页面。就这么简单! 1个重要的想法,你不能通过javascript激活扫描仪。出于安全原因,用户必须在 Android 中手动单击链接。 这是否需要在用户的设备上安装 XZing? 仅扫描仪。但它是 Android 上最常用的扫描仪之一。 play.google.com/store/apps/… 好问题,@DannyBeckett,谢谢你的提问。不幸的是,我需要该解决方案独立于扫描仪。我会相应地更新原始问题。【参考方案2】:您无法确保 URL 来自扫描二维码,这是不可能的。二维码只是一种对文本进行编码的方法,一旦用户知道了文本,他们就可以用它做任何他们想做的事情。
但是,您可以限制 QR 码的有用性,这样即使它被泄露也无用。如果可能的话,我会首先使用随机种子按需生成 QR 码,然后让它们很快过期。这样一来,即使二维码被泄露,它也不会在很长时间内有用。
【讨论】:
【参考方案3】:您能做的最好的事情就是在您的二维码中设置一个查询字符串。比如:
http://www.example.com/myapp
可以改为:
http://www.example.com/myapp/?qrcode=1
这可以在 php 中处理:
if(!isset($_GET['qrcode'])) die();
当然,这样做的问题是任何拥有该 URL 的人都可以在他们的普通网络浏览器中直接导航到该 URL。
但是,这不是您可以阻止的。
您还可以检查$_SERVER['HTTP_USER_AGENT']
是否声称是手机。这是 another question 的主题。
【讨论】:
HTTP_REFERER 能在这里玩吗?检查访问者是否(在一定的可信度范围内)直接来自 QR 扫描仪应用程序或其他网站? @praguianHTTP_REFERER
应该是空白的。所以你总是可以做if(!empty($_SERVER['HTTP_REFERER'])) die();
正是我所暗示的,@DannyBeckett。在您看来,这会是一种可行的解决方案吗?这也是我可以自己研究的东西,但是即使用户手动将 URL 粘贴到浏览器中,是否存在 HTTP_REFERER 可能为空白的合理/频繁的场景?就像在会议开始时一样,也许?只是想想想这种方法可能存在的漏洞。
@praguian 是的,这完全有可能。本质上,您需要使用几种不同事物的组合。使用查询字符串,检查用户代理是否是移动设备,并检查引用者是否为空。如果其中有任何项未能通过您的检查,die();
。
谢谢丹尼,我会试试这个组合。对于@str 上面关于具有能够扫描二维码的网络摄像头的非移动设备的观点,所讨论的网站无论如何都是为移动设备设计的,因此检查用户代理也是一个有价值的入口。我应该在我原来的问题中指定这一点,但这是容易的部分,所以我不想混淆这个问题。 :)【参考方案4】:
你可以添加参数,但最终二维码只是一种编码文本的方法,所以如果有人知道编码了什么,你编码的任何东西都可以输入到浏览器中。
【讨论】:
【参考方案5】:如果您通过 QR 码对任何 Web URL 进行后调用,那么您发送的任何正文都将不可见,除非用户通过 QR 扫描模式。因此,仅输入 Web URL 用户将无法访问网址内容。
【讨论】:
以上是关于限制站点仅访问 QR 扫描的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 IP 限制对我的 PHP 弹性 beanstalk 环境的访问?