最近a post Hacker News 报道了网站滥用 WebSockets 在客户端机器上查找开放端口。
帖子没有涉及任何细节,所以我决定试一试。
我在端口 8080 上打开了一个网络服务器,并尝试在 Chrome 的控制台中运行这个脚本:
function test(port) {
try {
var start = performance.now();
var socket = new WebSocket('ws://localhost:' + port);
socket.onerror = function (event) {
console.log('error', performance.now() - start, event);
}
socket.addEventListener('close', function(event) {
console.log('close', performance.now() - start, event);
})
socket.addEventListener('open', function (event) {
console.log('open', performance.now() - start, event);
socket.send('Hello Server!');
});
socket.addEventListener('message', function (event) {
console.log('message ', performance.now() - start, event);
});
} catch(ex) {
console.log(ex)
}
}
事实上,当我尝试连接到未打开的端口时,Chrome 会记录不同的错误消息 (ERR_CONNECTION_REFUSED
):
test(8081)
VM1886:3 WebSocket connection to 'ws://127.0.0.1:8081/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
当我尝试连接到一个打开但未监听 WebSocket 的端口时(意外响应代码:200
):
test(8080)
WebSocket connection to 'ws://127.0.0.1:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200
但我找不到任何方法来访问和读取 JavaScript 中的这些错误。
控制流没有到达 catch 子句 catch(ex) { console.log(ex) }
并且 Chrome 传递给 socket.onerror
的事件对象没有端口是否打开似乎有什么不同。
至少在 Chrome 中,计时攻击似乎也无济于事。 onerror
和 new Socket()
创建之间的增量时间似乎在调用 test(...)
几次后增加。
那么网页是否真的有一种方法可以确定我的计算机上的端口是否打开?
最佳答案
下面链接的演示幻灯片显示它在 2016 年广为人知,并且您的测试中没有时间差异表明缓解措施可能已在上游应用。
https://datatracker.ietf.org/meeting/96/materials/slides-96-saag-1/
关于google-chrome - 使用 WebSockets 进行端口扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61930898/