私はString.format
Java APIのメソッドを使って何かを記録しています。私の方法は次のようである:問題があるしかしJavaの安全String.formatとエスケープ%
public static void log(String message, Object... params){
System.out.println(String.format(message, params));
}
ユーザーがどこかで%
文字を持つメッセージを送信した場合、それは例外をスローします。ここではシナリオです:
log("SELECT * FROM my WHERE name like '%six%'");
とJavaは%s
を置き換えるために何かを探し(それは大丈夫です)と%'
(おっと)。私はそれを修正したい。 params
が存在しないため、%s
が失われ、%'
が例外となるためです。
1つの解決策はmessage.replace("%", "%%")
ですが、私はそれが優雅な解決策であるかどうかはわかりません。
String
で
%s
または
%
を使用しますが、パラメータを提供していない)のための簡単な解決策は、あなたの元のメソッドに加えにあなたの方法
にノーのparams過負荷を提供することで
:
また、以下は、コールサイトで使用することができます。彼らはあなたに壊れた入力を与える場合、彼らは作業出力を期待することはできません。ただ例外を投げる。 –
@Christoffer壊れた入力としてSQLの 'like'節を含むメッセージ文字列は表示されません。 – adarshr
文字列に '%s'と'% 'の両方が含まれ、1つがOKとみなされ、もう1つがそうでないと、入力が壊れます。入力が 'String.format()'のフォーマット文字列で、 'like'節の'%s 'がパラメータ値に置き換えられないようにするには、 '%% s'と'%s' % 'が壊れています。 –