@Patrikが提案するアプローチの実装は、PostgreSQLに対する挿入と更新の両方に対応しています。正規表現は、他のデータベース用のSQLのフォーマットに応じて微調整する必要があります。
class ActiveRecord::ConnectionAdapters::AbstractAdapter
protected
def log_with_binary_truncate(sql, name="SQL", binds=[], &block)
binds = binds.map do |col, data|
if col.type == :binary && data.is_a?(String) && data.size > 27
data = "#{data[0,10]}[REDACTED #{data.size - 20} bytes]#{data[-10,10]}"
end
[col, data]
end
sql = sql.gsub(/(?<='\\x[0-9a-f]{20})[0-9a-f]{20,}?(?=[0-9a-f]{20}')/) do |match|
"[REDACTED #{match.size} chars]"
end
log_without_binary_truncate(sql, name, binds, &block)
end
alias_method_chain :log, :binary_truncate
end
私はそれに満足していませんが、今は十分です。バイナリ文字列の最初と最後の10バイトを保持し、途中から何バイト/文字が削除されたかを示します。編集されたテキストが置き換えられたテキストより長い場合を除いては編集は行われません(つまり、削除する文字数が20文字以上でない場合、 "[REDACTED xx chars]"は置き換えられたテキストより長くなります) 。私は、編集されたチャンクの貪欲なまたは怠惰な繰り返しの使用がより速かったかどうかを判断するために、パフォーマンステストを行っていませんでした。私の本能は怠惰になってしまったので、私はしましたが、特にSQLにバイナリフィールドが1つしかない場合、欲張りが速くなる可能性があります。
パスワードのようなものをフィルタリングするオプションがありますが、それが役立つかどうかわかりません。 ActiveRecordを上書きしてハッキーを実行することを検討しますか?そうでなければあなたのヒントがあります。 –