在 Atomikos 初始化期间,用户名和密码以纯文本形式记录
User names and passwords are logged in plain text during initialization of Atomikos
我们的项目依赖于 Atomikos 来提供轻量级的事务管理。然而,我们发现它在初始化时以明文形式记录了数据库用户名和密码。
例如
2015-10-15 16:43:01,106 [http-bio-8080-exec-4] INFO com.atomikos.jdbc.AtomikosDataSourceBean - AtomikosDataSoureBean 'LAB_Oracle': initializing with [ xaDataSourceClassName=oracle.jdbc.xa.client.OracleXADataSource, uniqueResourceName=LAB_Oracle, maxPoolSize=8, minPoolSize=1, borrowConnectionTimeout=30, maxIdleTime=60, reapTimeout=0, maintenanceInterval=60, testQuery=null, xaProperties=[URL=jdbc:oracle:thin:@***:1537:oocait01,user=***,password=**] loginTimeout=0]
是否有任何配置可以禁止记录这些机密信息?
就配置而言,您可以将日志类别 com.atomikos.jdbc.AtomikosDataSourceBean
的阈值设置为 WARN
。有一些流行的日志记录框架的例子 here。这将过滤掉整条消息。
如果您只想过滤机密属性,您可以创建 AtomikosDataSourceBean
的子类并覆盖受保护的方法 printXaProperties()
。然后您可以过滤掉任何机密属性,例如密码。
package my.com.atomikos.jdbc;
import java.util.Enumeration;
import java.util.Properties;
public class AtomikosDataSourceBean extends com.atomikos.jdbc.AtomikosDataSourceBean {
private static final long serialVersionUID = 1L;
protected String printXaProperties()
{
Properties xaProperties = getXaProperties();
StringBuffer ret = new StringBuffer();
if ( xaProperties != null ) {
Enumeration it = xaProperties.propertyNames();
ret.append ( "[" );
boolean first = true;
while ( it.hasMoreElements() ) {
String name = ( String ) it.nextElement();
if ( name.equals ( "password" ) ) continue;
if ( ! first ) ret.append ( "," );
String value = xaProperties.getProperty( name );
ret.append ( name ); ret.append ( "=" ); ret.append ( value );
first = false;
}
ret.append ( "]" );
}
return ret.toString();
}
}
由于 Atomikos 会自动检测日志记录框架,这可能会根据您测试、打包和部署应用程序的方式而有所不同,因此使用子类可能更安全。
我提交了一个 pull request 可以进入第 4 版。我们拭目以待。
我们的项目依赖于 Atomikos 来提供轻量级的事务管理。然而,我们发现它在初始化时以明文形式记录了数据库用户名和密码。
例如
2015-10-15 16:43:01,106 [http-bio-8080-exec-4] INFO com.atomikos.jdbc.AtomikosDataSourceBean - AtomikosDataSoureBean 'LAB_Oracle': initializing with [ xaDataSourceClassName=oracle.jdbc.xa.client.OracleXADataSource, uniqueResourceName=LAB_Oracle, maxPoolSize=8, minPoolSize=1, borrowConnectionTimeout=30, maxIdleTime=60, reapTimeout=0, maintenanceInterval=60, testQuery=null, xaProperties=[URL=jdbc:oracle:thin:@***:1537:oocait01,user=***,password=**] loginTimeout=0]
是否有任何配置可以禁止记录这些机密信息?
就配置而言,您可以将日志类别 com.atomikos.jdbc.AtomikosDataSourceBean
的阈值设置为 WARN
。有一些流行的日志记录框架的例子 here。这将过滤掉整条消息。
如果您只想过滤机密属性,您可以创建 AtomikosDataSourceBean
的子类并覆盖受保护的方法 printXaProperties()
。然后您可以过滤掉任何机密属性,例如密码。
package my.com.atomikos.jdbc;
import java.util.Enumeration;
import java.util.Properties;
public class AtomikosDataSourceBean extends com.atomikos.jdbc.AtomikosDataSourceBean {
private static final long serialVersionUID = 1L;
protected String printXaProperties()
{
Properties xaProperties = getXaProperties();
StringBuffer ret = new StringBuffer();
if ( xaProperties != null ) {
Enumeration it = xaProperties.propertyNames();
ret.append ( "[" );
boolean first = true;
while ( it.hasMoreElements() ) {
String name = ( String ) it.nextElement();
if ( name.equals ( "password" ) ) continue;
if ( ! first ) ret.append ( "," );
String value = xaProperties.getProperty( name );
ret.append ( name ); ret.append ( "=" ); ret.append ( value );
first = false;
}
ret.append ( "]" );
}
return ret.toString();
}
}
由于 Atomikos 会自动检测日志记录框架,这可能会根据您测试、打包和部署应用程序的方式而有所不同,因此使用子类可能更安全。
我提交了一个 pull request 可以进入第 4 版。我们拭目以待。