【问题标题】:Java - How to determine if server is FTP or SFTP?Java - 如何确定服务器是 FTP 还是 SFTP?
【发布时间】:2018-07-17 11:39:42
【问题描述】:

我正在用 Java 制作一个从服务器下载特定文件的类。我有一种方法可以直接从 FTP 服务器下载,也可以从 SFTP 服务器下载。

如果不对主机名做出任何假设(不检查它是否以 ftp:// 或 sftp:// 开头,因为有时服务器可能是本地的),有没有办法确定服务器是 FTP 还是 SFTP ,因此使用哪种方法?

理想情况下,我想以编程方式确定,而不仅仅是在失败时尝试替代方案。提前感谢您的帮助!

编辑: 对于任何有兴趣的人,我非常基本且绝对不完美的解决方案是这样的:

private int determineServerProtocol(String host, String port) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try (Socket socket = new Socket(host, Integer.parseInt(port))) {
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            result = in.readLine();
            out.close();
            in.close();
        } catch (NumberFormatException | IOException e) {
            e.printStackTrace();
        }
        if (result.contains("SSH")) {
            System.out.println("Server is SFTP");
            // do things...
        } else {
            System.out.println("Server is FTP");
            // do things...
        }
    }

【问题讨论】:

  • FTP 和 SFTP 是完全不相关的协议。一个有自己的知名 TCP 端口和自己的协议,并且通常具有匿名访问权限。 SFTP 是 SSH 协议的子协议,几乎没有匿名访问(也没有标准机制)。身份验证机制也非常不同。也许您的意思是 FTPS 而不是 SFTP? FTPS 只是 FTP 的 SSL/TLS 版本。
  • 我正在编写一个程序来通过 FTP 与服务器通信,但将来会改为使用 SFTP。我想要一个能够以编程方式处理此更改的类,并在“轮询”服务器后确定要使用的协议。
  • @Spanner0jjm 你的解决方案有效吗?

标签: java ftp sftp


【解决方案1】:

协议必须与主机名和凭据一起成为会话设置的一部分。切勿尝试在安全和不安全协议之间进行自动检测。这是一个可怕的安全漏洞。

通过这种“自动检测”,可能的MITM attacker 可以使您的应用程序轻松使用未加密的 FTP 协议,即使真实服务器实际上使用的是 SFTP 协议。这将使您的应用程序将您的 SFTP 凭据直接发送给攻击者,未加密!


如果您想让您的应用程序与将来可能切换到 SFTP 的应用程序前向兼容,至少,一旦 SFTP 连接成功,使其永远不会回退到 FTP


我也没有看到明确的检测点。只需尝试使用 FTP 连接和验证,如果失败,请尝试 SFTP。您永远无法知道过渡将如何进行。他们可以选择让 FTP 服务器与 SFTP 一起运行,但禁用登录或任何其他组合。

【讨论】:

  • 你完全正确。我目前的设计永远不会“退回”使用不同的方法,但知道这一点很重要。谢谢!
【解决方案2】:

您可以进行远程登录。 Apache Commons 提供了许多互联网协议的客户端。

https://commons.apache.org/proper/commons-net/

然后分析答案。

据我所知,所有 SSH 服务器都使用 SSH 来回答某些问题。

telnet demo.wftpserver.com 2222
Trying 199.71.215.197...
Connected to demo.wftpserver.com.
Escape character is '^]'.
SSH-2.0-WingFTPServer

不是 SSH

telnet  ftp.funet.fi 21
Trying 193.166.3.2...
Connected to ftp.funet.fi.
Escape character is '^]'.
220 FTP Welcome

【讨论】:

  • 永远不要这样做!如果您依赖自动检测,则可能的攻击者可以强制您使用未加密的 FTP 协议,即使服务器使用的是 SFTP 协议。并窃取您的 SFTP 凭据。见my answer
  • 每台服务器都可以返回不同的答案——你将很难分析所有的答案。
猜你喜欢
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多