You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:36:06