最近利用开源项目搭建了一个小程序,后端代码担心有注入风险。于是想通过nginx
做下访问限制,仅让微信服务器可访问项目,其他禁止访问。
先看下微信的访问日志:
125.33.88.243 - - [29/Sep/2020:14:51:31 +0800] "GET /api/getDetail.php?id=1 HTTP/1.1" 200 671 "https://servicewechat.com/wx4b89a5dd2d892e01/devtools/page-frame.html" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 wechatdevtools/1.02.2004020 MicroMessenger/7.0.4 Language/zh_CN webview/"
推荐方案一
配置referer
server {
listen 80;
server_name your_site.com;
location / {
# 推荐方案
# 匹配 referer 为空、防火墙伪装、微信域名
# valid_referers none blocked *.servicewechat.com;
# 仅匹配 微信域名
valid_referers *.servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
}
备选方案二
通过 user_agent
实现
server {
listen 80;
server_name your_site.com;
location / {
# 备选方案,通过 user_agent
if ($http_user_agent !~* "MicroMessenger") {
return 403;
}
}
}
二合一方案
server {
listen 80;
server_name your_site.com;
location / {
set $flag 0;
# 匹配 referer 为微信域名
valid_referers *.servicewechat.com;
if ($invalid_referer) {
set $flag "${flag}1";
}
# 通过 user_agent
if ($http_user_agent !~* "MicroMessenger") {
set $flag "${flag}2";
}
#逻辑与实现方式
if ($flag = "012"){
return 403;
}
}
}
注:该方式仅从 Referer 和 User-Agent 来做的限制,如果对方伪装仍可继续访问