Code Bye

如何限制网页只能在微信内置浏览器中打开访问

最近公众号和个人网站进行了对接,用户回复关键词,公众号返回图文消息给用户,用户再点击图文消息即可跳转到一个网页链接,在微信的内置浏览器中打开。问题是这个页面在电脑上的浏览器也是可以访问的,那么其他人就可以很随便地查看页面的源代码,或者模拟请求了。有什么方法可以防止这一点呢?

浏览器访问网页时都会发送一个UserAgent给服务器,它里面包含了一些浏览器及用户操作系统的基本信息,既然微信有内置浏览器,那么用微信浏览网页时这个UserAgent里面应该会带上和微信相关的独有的标识。测试后证实了这一说法,UserAgent为:

Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255

解决方案就是用js判断请求的UserAgent,代码如下:

<script type=”text/javascript”>
// 对浏览器的UserAgent进行正则匹配,不含有微信独有标识的则为其他浏览器
var useragent = navigator.userAgent;
if (useragent.match(/MicroMessenger/i) != ‘MicroMessenger’) {
// 这里警告框会阻塞当前页面继续加载
alert(‘已禁止本次访问:您必须使用微信内置浏览器访问本页面!’);
// 以下代码是用javascript强行关闭当前页面
var opened = window.open(‘about:blank’, ‘_self’);
opened.opener = null;
opened.close();
}
</script>

代码在Android、iPhone、iPad、PC上都进行了测试,只要不是在微信内部打开网页的,首先就会弹出上面那个警告框,此时后面的页面是空白的,什么都还没加载,当点击警告框的确定按钮之后,最后三行代码将强行关闭当前页面。

注:对于伪造的UserAgent,还是可以绕过这条限制的,总的来说就是防君子不防小人。

网上找到的方式汇总:

可以按照以下方式设置:
1、js或程序判断,userAgent,是否包含micromessenger。
2、js判断微信相关特有函数。
3、调用oauth接口,如果不想用户感知的,可以调用scope=snsapi_base的方式,这个最后只能获得用户openid。scope=snsapi_userinfo方式,用户会看到一个授权页面,点击授权后,可以获得用户所有信息。
4、还可以通过判断是否为WeixinJSBridge进行限制,如(其他程序语言按照对应语法进行修改):
if( typeof WeixinJSBridge !== “undefined” )
{

return true;
}

可行性有待进一步测试,有时间的可以试一下。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何限制网页只能在微信内置浏览器中打开访问