kotlin - 如何在 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 (?, ?)
解决方案
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)
}
}
希望这对和我有同样问题的人有所帮助。
推荐阅读
- javascript - PHP - 提交按钮并在不刷新的情况下获取值
- tsql - 选择 SQL 以选择同一日期的下一个不匹配记录
- php - 如何为社交网站中的新帖子创建 post_id
- mysql - MySQL 2 列不在(一项数组)
- javascript - 无法在 javaScript 的嵌套 if 语句中调用全局变量
- azure-devops - Azure DevOps Pipeline CMake 与 MSVC 和 NMake
- java - 未指定 Java 客户端 Web 服务器错误文件路径
- angular - 如何发出 Observable 然后限制订阅
- python - 将多维字典(fetchall-type)转换为多维列表
- javascript - Java-script:尝试向我的变量添加小数位