首页 > 解决方案 > 如何在 Exposed 中禁用 SQL 参数记录?

问题描述

我使用默认的Exposed框架配置,它具有框架为数据库调用创建的 SQL 语句的内置日志记录。结果,我在日志中看到以下格式的 SQL 语句:

[...] DEBUG Exposed - INSERT INTO sensitive_table (column1, column2) VALUES ('PII1', 'PII2')

是否可以在 Exposed 中配置日志记录以隐藏(例如替换为“?”)SQL 语句参数中可能存在的敏感信息?

[...] DEBUG Exposed - INSERT INTO sensitive_table (column1, column2) VALUES (?, ?)

标签: kotlinkotlin-exposed

解决方案


SqlLogger我使用记录 SQL 而不注入参数值的自定义解决了这个问题。

object SafeSqlLogger : SqlLogger {

    private val log: Logger = LoggerFactory.getLogger(SafeSqlLogger::class.java)

    override fun log(context: StatementContext, transaction: Transaction) {
        log.debug(context.sql(TransactionManager.current()))
    }
}

我在 logback 配置中禁用了 Exposed 记录器。

<logger name="Exposed" level="OFF"/>

并将记录器添加到我想要记录的事务中。

transaction {
    addLogger(SafeSqlLogger)
    // query the database
}

结果,我得到了以下日志语句:

[...] DEBUG SafeSqlLogger - INSERT INTO sensitive_table (column1, column2) VALUES (?, ?)

最后写了一个函数,可以用来代替transaction记录的事务。

fun <T> loggedTransaction(db: Database? = null, statement: Transaction.() -> T): T {
    return transaction(db.transactionManager.defaultIsolationLevel,
        db.transactionManager.defaultRepetitionAttempts,
        db
    ) {
        addLogger(SafeSqlLogger)
        statement.invoke(this)
    }
}

希望这对和我有同样问题的人有所帮助。


推荐阅读