Clojure Swank服务器是否打开了公共端口?

10

(这个问题被投了反对票,我觉得很奇怪。我犯了什么错误吗?)

我是否正确地认为运行swank服务器通常会打开端口4005,而不是绑定到本地主机连接?

因此,任何在咖啡馆黑客的人不仅允许路人在他们的计算机上执行任意代码,而且还为他们提供了一个漂亮的界面来完成此操作。

当我使用'mvn clojure:swank'、'lein swank'或(swank.swank/start-server "/tmp/yo")运行swank服务器时,似乎会出现类似以下内容的情况(感谢Mike!):

$lsof -i -P
java      11693 john   13r  IPv6 6701891      0t0  TCP *:34983 (LISTEN)

实际上我可以从同一网络上的另一台计算机上运行的emacs连接。

(swank.swank/start-server "/tmp/yo")

如果我手动启动服务器,它会产生以下输出

Connection opened on local port  34983
#<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=34983]>

鉴于:

(swank.swank/start-server "/tmp/yo" :host "localhost")

产生:

Connection opened on local port  40368
#<ServerSocket ServerSocket[addr=localhost/127.0.0.1,port=0,localport=40368]>

这看起来更像是我期望的。

有没有什么很好的理由去做这件事呢?

对于如何说服它只接受来自本地进程的连接,有什么更常规的方法吗?

3个回答

5
完全是合理的问题。
打开slime服务器后,您会注意到:
eames:~:% lsof -i -P | grep 4005
java      41477  mjd   33u  IPv6 0x0b8956d0      0t0  TCP [::127.0.0.1]:4005 (LISTEN)

连接监听本地地址的4005端口。此接口未暴露给网络,因此网络上的其他设备无法连接到您的slime服务器。
编辑:
这是使用leiningen启动swank的结果,它提供“localhost”作为swank.swank/start-server的参数。您可能需要仔细检查leiningen插件是否打开了非本地端口。
如果未显式提供主机,则swank会在每个地址上打开连接。相关代码是swank.util.net.sockets/make-server-socket,并且已记录此行为。我同意,这似乎是错误的默认设置。

java 10561 john 14r IPv6 6521448 0t0 TCP *:4005 (LISTEN) - John Lawrence Aspden
那是一个公开暴露的端口。你是如何启动Swank的? - Mike Douglas
Mike,抱歉回复过于简短。我正在编辑原始内容,不知怎么的复制粘贴到了评论中。感谢你的诊断! - John Lawrence Aspden
使用 $lein new test 生成一个新项目,会得到以下内容:(defproject test "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"]]) 确实,从这里运行 lein swank 似乎会打开一个本地端口。看起来默认设置最近已经更改了。谢谢! - John Lawrence Aspden
3
如果你正在使用 swank-clojure.el,你可以在 swank-clojure-init 中控制服务器启动的 format 字符串中添加 :host \"localhost\",以仅在本地主机上进行监听(在 "(swank.swank/start-server ...)\n\n" 处查找)。请注意,不要改变原来的意思。 - Michał Marczyk
显示剩余3条评论

1
如果您正在使用clojure-maven-plugin,最近发布了1.3.4版本,它现在会启动针对本地主机的swank服务器以防止此问题。
此行为可以在您的pom.xml文件中进行配置:
<configuration>
  <swankHost>someotherhostname</swankHost>
</configuration>

或者可以通过命令行执行:

mvn clojure:swank -Dclojure.swank.host=someotherhostname

太棒了,你注意到这个漏洞并在一天内关闭它真是太辛苦了。干得好,马克!我希望我能接受两个答案! - John Lawrence Aspden
我已经测试了快照版本(git克隆,然后mvn安装,然后修改项目pom.xml)。它非常好用。 - John Lawrence Aspden

1

它只接受一个连接,因此即使暴露在外界,一旦连接,它就停止监听。


虽然在断开连接时它不会开始监听有点让人烦恼(虽然这样更安全),但重新启动它确实并不需要太多的工作量,而不是要记住在完成时停止它。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接