我使用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
将会丢失,%'
会导致异常。
一个解决方案可以是message.replace("%", "%%")
但我不确定它是否是一个优雅的解决方案。
我不明白为什么'%s'将是确定的,如果''%是没有的。如果他们给你破碎的输入,他们不能指望工作输出。只是抛出一个异常。 –
@Christoffer我没有看到包含SQL'like'子句的消息字符串作为中断输入。 – adarshr
如果字符串同时包含'%s'和'%',并且一个被认为是OK而另一个不是,那么输入被破坏。如果输入是'String.format()'的格式字符串,并且您不希望'like'语句中的'%s'被参数值替换,则除'%% s'和'% %'在输入中断。 –