為了防止 Web App 被複製,開發者常想限制只能在微信內開啟。本文提供基於 User-Agent 判斷的 PHP 實作,並深入分析其安全性缺陷與繞過手法,幫助開發者建立正確防護觀念。
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'MicroMessenger') === false) {
exit('非微信瀏覽器禁止訪問');
}
echo '微信瀏覽器允許訪問';
?>
<?php
$userAgent = addslashes($_SERVER['HTTP_USER_AGENT']);
if (strpos($userAgent, 'MicroMessenger') === false &&
strpos($userAgent, 'Windows Phone') === false) {
exit('非微信瀏覽器禁止訪問');
}
echo '微信瀏覽器允許訪問';
?>
此防護機制屬於「誠實者防君子」層級,無法阻擋有心人士。
MicroMessenger 字串curl -H "User-Agent: MicroMessenger" URL<script>
if (navigator.userAgent.indexOf('MicroMessenger') === -1) {
document.body.innerHTML = '<div style="padding:20px;text-align:center;">請在微信中打開</div>';
}
</script>
但同樣可被禁用 JS 或偽造 DOM 繞過。
| 方案 | 安全性 | 實作複雜度 |
|---|---|---|
| 微信 OAuth2.0 授權登入 | 高(驗證真實用戶身份) | 中 |
| JSSDK 驗證簽名 | 高(需微信服務器簽名) | 中高 |
| IP 白名單(微信回調 IP) | 中(需定期更新 IP 段) | 低 |
| Referer 檢查 | 低(可偽造) | 低 |
User-Agent 判斷僅適合「提示用戶請在微信開啟」等輕量級場景。涉及敏感資料、支付、授權等業務,必須採用微信官方 OAuth2.0 或 JSSDK 驗證機制,從源頭驗證請求合法性。