2011-04-12 48 views
2

我正在尋找一種方法從java.sql.Connection對象中獲取密碼。我知道DatabaseMetaData對象中有一個getUserName()方法,但不幸的是沒有相應的getPassword()方法。在Netbeans中使用調試器,我可以看到一個密碼字段,所以必須有一種方法來使用反射來獲取這些信息,但到目前爲止,我一直無法弄清楚。如何從java.sql.Connection對象中檢索密碼

+1

這將是有趣的。正如你所指出的,我認爲這不可能通過公共API。也許在Driver實現或DriverManager的某個地方,如果它是開源的,你可以看看。我懷疑這是連接。 – 2011-04-12 00:31:49

+2

這是我見過的最離奇的要求之一。此外,它有潛在的安全漏洞。 – 2011-04-12 01:43:46

+2

所以,如果你已經看到調試器中的字段,爲什麼你不能使用反射? – jtahlborn 2011-04-12 03:08:55

回答

1

正如我所評論的,唯一的方法必須查看代碼。例如,對於使用最新驅動程序的MySQL(5.1.15)。你可以得到這樣的密碼:

public static void main(String[] args) throws Exception{ 
    ConnectionImpl con = (ConnectionImpl) DriverManager.getConnection("jdbc:mysql://localhost:3908/mydb?user=edalorzo&password=mandrake"); 

    System.out.println(con.getProperties().get("password")); 

    con.close(); 
} 

但是爲此,你需要知道類層次結構及其實現細節。

其他數據庫很可能會有所不同。如果你的數據庫是開源的,比如MySQL,你可以知道內部結構的細節並找到獲取密碼的方法。

+0

這工作得很好,比我往下的反射路徑要好得多。 – Gillman 2011-04-13 00:23:32

2

由於用戶和密碼作爲映射傳遞到Driver,所以由JDBC的實施者決定。

知道密碼的一種方法是擴展驅動程序幷包含它。

class CustomDriver extends ImplementerDriver { 
    @Override 
    public Connection connect(String url, Properties info) throws SQLException { 
    super.connect(url, info); 
    // Extract password from info. 
    } 

    public String getPassword() { 

    .... 
    } 
} 
0

您可以解析連接池參數的服務器XML配置文件,並從那裏獲取密碼。複雜的解決方案,但它的作品