【问题标题】:Is there a way to check if a user is connected to a site through Tor using JavaScript?有没有办法使用 JavaScript 检查用户是否通过 Tor 连接到网站?
【发布时间】:2015-11-29 03:28:32
【问题描述】:
如果用户通过 Tor 连接,我希望能够显示消息等。这不需要完全安全,它应该是客户端。如果需要,它可以使用外部 API 或站点来获取 IP 地址或类似的东西。
【问题讨论】:
-
-
-
您只需根据已知退出地址列表检查他们的 IP。我想不出任何办法让这个 100% 客户端(你需要知道他们的 IP 并能够根据列表检查它。如果你能够使用服务器端脚本来创建一个动态 JS 文件根据预先确定的、经常更新的地址列表检查他们的 IP,我想你可以让它工作。在我的网站上,我发布了一个地址列表(每 10 分钟更新一次),你可以免费使用。drew-phillips.com/tor-exit-list.txt跨度>
标签:
javascript
web
connection
tor
【解决方案1】:
我使用此功能以一定的概率检查 Tor:
- performance.now() (在 Tor 中总是四舍五入为 100.0) (Date.now() 也是四舍五入)
- navigator.hardwareConcurrency (在 Tor 中始终为 1)
- devicePixelRatio (在 Tor 中始终为 1)
例子:
var isTor = true;
if (navigator.hardwareConcurrency && navigator.hardwareConcurrency !== 1) {
//This may not happen in Tor Browser because in Tor hardwareConcurrency is always 1
isTor = false;
}
if (window.devicePixelRatio && devicePixelRatio !== 1) {
//This may not happen in Tor Browser because in Tor devicePixelRatio is always 1
isTor = false;
}
checkTor_byCurTime()
//Do something...
checkTor_byCurTime();
//Do something again...
checkTor_byCurTime();
// <<< Here you can use isTor var >>>
function checkTor_byCurTime() {
if (performance.now() % 100 !== 0) {
//This may not happen in Tor Browser but in other browsers it happens almost every time
isTor = false;
}
}
如果您不需要同步检查,您还可以添加 setTimeout 调用:
setTimeout(checkTor_byCurTime, 1);
setTimeout(checkTor_byCurTime, 2);
setTimeout(checkTor_byCurTime, 3);
setTimeout(checkTor_byCurTime, 5);
setTimeout(checkTor_byCurTime, 7);
setTimeout(checkTor_byCurTime, 11);
setTimeout(checkTor_byCurTime, 13);
这里是使用函数的 polyfill:
if (!window.performance) window.performance = {};
if (!performance.now) performance.now = function() { return Date.now(); };
if (!Date.now()) Date.now = function() { return (new Date).getTime(); };
【解决方案2】:
Here 是一个 JavaScript 文件,您可以加载以查看访问者是否在使用 Tor。它会将window._isTor 设置为true 或false,具体取决于加载脚本的远程IP 是否来自Tor 出口节点。
像这样在您的页面上加载它(域支持 TLS 1.0 - TLS 1.2 连接,无 SSL):
<script src="//openinternet.io/tor/istor.js"></script>
检查:
<script>
if (typeof window._isTor != 'undefined' && window._isTor == true) {
// VISITOR IS USING TOR - code here
} else {
// not using Tor or the value was undefined
}
</script>
要么把它放在<head> 标签中(会减慢页面加载时间),要么推迟加载它并在完成后检查值。
如果您愿意,我将提供动态生成该 JavaScript 的脚本的源代码 (PHP)。
我还计划尽可能长时间地保持该 URL 处于活动状态 - 但不保证可用性、可靠性或它会保持多年。
编辑:应该注意的是,现在 Tor 默认启用 NoScript 有一段时间,这可能会阻止从另一个域加载的 JS,所以这可能会也可能不会起作用。