如何配置Tauri应用仅加载指定URL,禁止打开未授权远程链接
如何限制Tauri WebView仅加载授权URL
核心方案:通过before-navigate钩子拦截导航
这是生产环境最可靠的拦截方式,直接在Tauri主进程里捕获所有导航请求,只放行你指定的目标。
实现步骤
打开src-tauri/src/main.rs,添加以下导航拦截逻辑:
use tauri::{Manager, WindowEvent}; use url::Url; fn main() { tauri::Builder::default() .setup(|app| { let main_window = app.get_window("main").unwrap(); // 监听导航请求事件 main_window.on_window_event(|event| { if let WindowEvent::NavigationRequested { url, .. } = event { let target_url = Url::parse(url.as_str()).unwrap(); // 定义你授权的域名列表 let allowed_domains = vec!["vitejs.dev", "react.dev", "tauri.app"]; // 判断是否为本地资源(应用内页面/tauri协议) let is_local_resource = target_url.scheme() == "tauri" || target_url.scheme() == "file"; // 仅允许本地资源或授权域名的导航 if !is_local_resource { match target_url.host_str() { Some(host) if !allowed_domains.contains(&host) => { // 阻止未授权导航 event.prevent_default(); // 可选:如果需要,把未授权链接转到默认浏览器打开 // tauri::api::shell::open(&main_window.shell_scope(), url.as_str(), None).unwrap(); }, _ => {} } } } }); Ok(()) }) .run(tauri::generate_context!()) .expect("failed to run tauri app"); }
说明:
- 这段代码会拦截WebView所有导航请求,只有本地资源(
tauri:///file://协议)和授权域名下的链接能正常加载 - 未授权链接会被直接阻止,你也可以取消注释代码,将其转至默认浏览器打开
配合CSP配置双重加固
在tauri.conf.json里优化CSP规则,和主进程钩子形成双重防护:
"security": { "csp": { "default-src": ["'self'"], "connect-src": ["'self'"], "frame-src": ["'self'"], "navigate-to": ["'self'", "https://vitejs.dev", "https://react.dev", "https://tauri.app"] } }
说明:
navigate-to指令明确限定了允许导航的目标范围'self'允许应用内部页面的正常路由跳转
前端辅助处理(可选)
在React组件里统一处理<a>标签的点击行为,进一步规避风险:
import { open } from '@tauri-apps/api/shell'; const handleAuthorizedLink = async (e: React.MouseEvent<HTMLAnchorElement>, url: string) => { const allowedDomains = ['vitejs.dev', 'react.dev', 'tauri.app']; const parsedUrl = new URL(url); if (!allowedDomains.includes(parsedUrl.hostname)) { e.preventDefault(); // 可选:提示用户该链接未被授权 return; } // 如需强制在默认浏览器打开授权链接,取消以下两行注释 // e.preventDefault(); // await open(url); }; // 使用示例 <a href="https://vitejs.dev" onClick={(e) => handleAuthorizedLink(e, "https://vitejs.dev")} > Vite Logo </a>
生产环境注意事项
- 把授权域名列表提取到配置文件或环境变量中,方便后续维护更新,避免硬编码
- 测试所有导航场景:包括
<a>标签跳转、window.location.href跳转、iframe嵌入等,确保拦截逻辑全覆盖 - 配合Tauri的
security.allowlist配置,禁用不需要的系统API,进一步缩小攻击面
内容的提问来源于stack exchange,提问作者ZOus7
相关产品推荐
相关产品推荐

