这是建立连接的方式(除了通过边缘列表之外别无他法):
gephi/io/importer/plugin/database/ImporterEdgeList.java
private void importData() throws Exception {
//Connect database
String url = SQLUtils.getUrl(database.getSQLDriver(), database.getHost(), database.getPort(), database.getDBName());
try {
report.log("Try to connect at " + url);
connection = database.getSQLDriver().getConnection(url, database.getUsername(), database.getPasswd());
report.log("Database connection established");
}
这是通过 getUrl 从您在 Edge List 中传递的字段形成连接字符串的方式:
gephi/io/database/drivers/SQLUtils.java
public static String getUrl(SQLDriver driver, String host, int port, String dbname) {
String res = "jdbc:";
res += driver != null ? driver.getPrefix() : "";
res += "://";
res += host != null ? host : "";
res += ":";
res += port != 0 ? port : "";
res += dbname != null ? "/" + dbname : "";
return res;
}
这就是在 SQLServerDriver 中建立最终连接的方法:
gephi/modules/DBDrivers/src/main/java/org/gephi/io/database/drivers/SQLServerDriver.java
public Connection getConnection(String connectionUrl, String username, String passwd) throws SQLException {
//Bug #745414
if (!connectionUrl.contains(";databaseName=")) {
String dbname = connectionUrl.substring(connectionUrl.lastIndexOf('/') + 1);
String url = connectionUrl.substring(0, connectionUrl.lastIndexOf('/'));
connectionUrl = url + ";databaseName=" + dbname;
}
return DriverManager.getConnection(connectionUrl, username, passwd);
}
public static Connection getConnection(String url, String user, String password)
如果您将主机设置为:您可能能够在主机字段上进行注入:
server\instance;integratedSecurity=true;authenticationScheme=javakerberos;password=
如果您将其用作 password=:,您将绕过插入的 res += ":"; 中的语法错误
像往常一样设置 dbName,将端口留空并设置一个虚拟用户名和密码。
现在您必须希望驱动程序不会推翻 Windows 身份验证,因为您使用凭据调用了 getConnection。
如果这不起作用,您唯一的方法是将ImporterEdgeList.java插件的源更改为调用getConnection(String url),如果冒号绕过不起作用,则根据database.getHost()手动伪造url。
类似的东西:
private void importData() throws Exception {
//Connect database
String url = "jdbc:";
url += driver != null ? database.getSQLDriver().getPrefix() : "sqlserver";
url += "://";
url += database.getHost();
try {
report.log("Try to connect at " + url);
connection = database.getSQLDriver().getConnection(url);
report.log("Database connection established");
}
通过这个技巧,您可以通过主机变量指定连接字符串的其余部分