如何在 Firefox 中伪造地理位置?

信息安全 隐私 网页浏览器 火狐 地理位置
2021-08-25 20:23:00

谷歌和许多其他网站都知道我的正确位置。如何在不使用 VPN、代理、Tor 或类似工具的情况下伪造我的位置?

我去about:config寻找地理。我认为我必须修改的是geo.wifi.uri也许我们可以直接输入错误的纬度和经度值?如果是这样,那它会是什么样子?我真的不知道格式。

还是有另一种在 Greasemonkey 中使用 JavaScript 的方法?

2个回答

伪造地理位置

您可以通过以下方式欺骗通过HTML5 Geolocation API提供的位置:

  • about:config

  • 输入geo.provider.network.url(或geo.wifi.uri旧版本)

  • 将值更改为如下所示:

    data:application/json,{"location": {"lat": 40.7590, "lng": -73.9845}, "accuracy": 27000.0}
    

    latlng值确定您所在位置的纬度和经度。

  • 确认geo.enabledtrue.

  • 您可能还需要设置geo.provider.testingtrue. (如果密钥不存在,则创建密钥。)

  • 恭喜,您现在在时代广场!(在这里验证结果。)

注意:这不会阻止网站从您的 IP 地址获取位置。您不能在应用程序层上执行此操作,而必须使用代理。

禁用地理位置

出于隐私原因,您可能希望完全阻止使用 API:

  • 转到about:config并设置geo.enabledfalse

一些技术细节

Firefox 中的地理定位服务是在dom/geolocation/Geolocation.cpp. nsGeolocationService::Init()您看到没有geo.enabled的情况下,API 初始化会立即中止:

  if (!StaticPrefs::geo_enabled()) {
    return NS_ERROR_FAILURE;
  }

此外,浏览器会根据您的平台和设置在不同的位置提供商之间进行选择。如您所见,有一些偏好可以单独切换它们(例如,如果您使用的是 MacOS,则可以设置geo.provider.use_corelocationfalse通过 Apple 的Core Location API禁用地理定位):

#ifdef MOZ_WIDGET_ANDROID
  mProvider = new AndroidLocationProvider();
#endif

#ifdef MOZ_WIDGET_GTK
#  ifdef MOZ_GPSD
  if (Preferences::GetBool("geo.provider.use_gpsd", false)) {
    mProvider = new GpsdLocationProvider();
  }
#  endif
#endif

#ifdef MOZ_WIDGET_COCOA
  if (Preferences::GetBool("geo.provider.use_corelocation", true)) {
    mProvider = new CoreLocationLocationProvider();
  }
#endif

#ifdef XP_WIN
  if (Preferences::GetBool("geo.provider.ms-windows-location", false) &&
      IsWin8OrLater()) {
    mProvider = new WindowsLocationProvider();
  }
#endif

  if (Preferences::GetBool("geo.provider.use_mls", false)) {
    mProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1");
  }

仅当没有特定于平台的提供程序适用时,或者如果geo.provider.testingis true,Firefox 默认使用网络(基于 URL)提供程序:

  if (!mProvider || Preferences::GetBool("geo.provider.testing", false)) {
    nsCOMPtr<nsIGeolocationProvider> geoTestProvider =
        do_GetService(NS_GEOLOCATION_PROVIDER_CONTRACTID);

    if (geoTestProvider) {
      mProvider = geoTestProvider;
    }
  }

网络提供商 ( dom/system/NetworkGeolocationProvider.jsm) 然后请求 中指定的 URL geo.provider.network.url您可以设置自己的模拟 HTTP 位置服务并在此处输入其 URL。但更容易的是,就像在顶部的步骤中一样,使用data:伪 URI 来模拟无条件响应您所需位置详细信息的网络提供商就足够了。

只要您的流量直接流向他们(也就是说,不是通过某种代理),他们就会拥有您的 IP,从而获得粗略的地理位置。

我如何在没有 vpn / proxy / tor 等的情况下伪造我的位置?

为什么你有这个限制?