在 2018年10月18日星期四 UTC+8上午11:28:39,Tatu Saloranta写道:
>
> On Tue, Oct 16, 2018 at 5:59 PM wjm wjm <[email protected] <javascript:>>
> wrote:
> >
> > 在 2018年10月17日星期三 UTC+8上午12:54:52,Tatu Saloranta写道:
> >>
> >> On Tue, Oct 16, 2018 at 9:50 AM wjm wjm <[email protected]> wrote:
> >>>
> >>>
> >>> 1/2. "too big" or "too small" number, maybe should throw exception,
> just like Integer.parseInt(......);
> >>
> >>
> >> yes, in cases where this occurs that makes sense.
> >>
> >>>
> >>> 3.valid range of BigInteger/BigDecimal should be determined by
> different scenes
> >>> but i'm not sure what is the "best" default configuration
> >>> or just default to unlimit, it's develop team's duty to set a valid
> configuration for it, :)
> >>
> >>
> >> The problem here is that if there is anywhere someone with legitimate
> use and that breaks in a patch release,
> >> dev team usually gets to hear about it. So it is important to balance
> quick fix with some caution.
> >
> > my "develop team" means customer team, not jackson team, so default to
> unlimit will not break customer's logic
> > but if they want to fix DoS attack problem of BigInteger/BigDecimal (not
> enum/int/long and so on), they must set a sensible range for their
> business logic.
>
> Ideally the default would -- I think -- not be unlimited because doing
> that will leave most users vulnerable.
> So I agree that yes, if default was unlimited, nothing would break.
> But it would be good to find defaults that
> protect most users and are unlikely to break many.
>
agree, it's great if can find a suitable default value.
>
> >> But I think that one relative small fix to `_parseSlowInt()` (which I
> checked in 2.9 branch)
> >> might help quite a bit, if anyone wants to test. I will try to add
> tests too, but this is tricky one
> >> to test... not sure how to automate since it is very difficult to
> automatically verify timing
> >> problems due to usual performance measurement challenges (JVM startup
> slowness etc).
> >>
> >> -+ Tatu +-
> >
> > As long as the numbers are large enough, then old parse speed is very
> slow
> > eg:
> > Strings.repeat("1", 100_0000)
> > old logic will cost 17+ seconds in my machine
> > but if fail quickly, only cost 10+ milliseconds
> > so think about difference between machines, we can treat less than 1
> second to be a fixed status?
>
> My main concern is that manually testing this is easy enough but that
> I am not sure logic is easy to automate in a way that
> does not cause false test failures on some systems (when running tests
> on cold JVM for example).
>
> But maybe others can point to cool test extensions or libraries that
> can handle this kind of testing -- reliably detecting
> performance problems with some sort of statistical running of test for
> a while, which is done for performance benchmarking.
>
> -+ Tatu +-
>
> >>
> >>
> >>>
> >>>
> >>> 在 2018年10月16日星期二 UTC+8下午11:08:11,Tatu Saloranta写道:
> >>>>
> >>>> On Tue, Oct 16, 2018 at 8:02 AM wjm wjm <[email protected]> wrote:
> >>>> >
> >>>> > seems that jackson have some problems when parse super number
> >>>> > Gson failed at once, but jackson block long times and then failed
> >>>> > because jackson parse the super number to BigInteger first and then
> convert to target number type.
> >>>> >
> >>>> > i write a reproduce test case
> >>>> > please help me to resolve the problem, thanks
> >>>> >
> >>>> > package test.jackson;
> >>>> >
> >>>> > import java.util.concurrent.Callable;
> >>>> >
> >>>> > import com.fasterxml.jackson.databind.ObjectMapper;
> >>>> > import com.google.common.base.Strings;
> >>>> > import com.google.gson.Gson;
> >>>> > import com.google.gson.GsonBuilder;
> >>>> >
> >>>> > public class DoS {
> >>>> > static String input = Strings.repeat("1", 100_0000);
> >>>> >
> >>>> > static Gson gson = new GsonBuilder().create();
> >>>> >
> >>>> > static ObjectMapper mapper = new ObjectMapper();
> >>>> >
> >>>> > public static enum Color {
> >>>> > WHITE,
> >>>> > BLACK
> >>>> > }
> >>>> >
> >>>> > static void run(String name, Callable callable) {
> >>>> > System.out.println(name);
> >>>> >
> >>>> > long start = System.currentTimeMillis();
> >>>> > try {
> >>>> > Object result = callable.call();
> >>>> > System.out.println(" result:" + result);
> >>>> > } catch (Throwable e) {
> >>>> > //System.out.println(" failed: " + e.getMessage());
> >>>> > System.out.println(" failed");
> >>>> > }
> >>>> > System.out.println(" time:" + (System.currentTimeMillis() -
> start) + " ms");
> >>>> > }
> >>>> >
> >>>> > public static void main(String[] args) {
> >>>> > run("Gson enum:", () -> gson.fromJson(input, Color.class));
> >>>> > run("Jackson enum:", () -> mapper.readValue(input,
> Color.class));
> >>>> > System.out.println();
> >>>> >
> >>>> > // byte/Byte/short/Short/int/Integer/long/Long
> >>>> > // all these types, jackson is very slow
> >>>> > run("Gson int:", () -> gson.fromJson(input, int.class));
> >>>> > run("Jackson int:", () -> mapper.readValue(input, int.class));
> >>>> > System.out.println();
> >>>> >
> >>>> > // float/Float/double/Double
> >>>> > // all these types, jackson is very slow
> >>>> > run("Gson double:", () -> gson.fromJson(input, double.class));
> >>>> > run("Jackson double:", () -> mapper.readValue(input,
> double.class));
> >>>> > System.out.println();
> >>>> > }
> >>>> > }
> >>>> >
> >>>> >
> >>>> > the output is :
> >>>> > Gson enum:
> >>>> > result:null
> >>>> > time:16 ms
> >>>> > Jackson enum:
> >>>> > failed
> >>>> > time:17469 ms
> >>>> >
> >>>> > Gson int:
> >>>> > failed
> >>>> > time:32 ms
> >>>> > Jackson int:
> >>>> > failed
> >>>> > time:17392 ms
> >>>> >
> >>>> > Gson double:
> >>>> > result:Infinity
> >>>> > time:8 ms
> >>>> > Jackson double:
> >>>> > result:Infinity
> >>>> > time:18187 ms
> >>>>
> >>>> Ok, this is obviously a big problem. I filed:
> >>>>
> >>>> https://github.com/FasterXML/jackson-databind/issues/2157
> >>>>
> >>>> to cover it, and this is related to earlier
> >>>>
> >>>> https://github.com/FasterXML/jackson-databind/issues/2141
> >>>>
> >>>> Unfortunately problem is difficult to tackle. Jackson does figure out
> >>>> magnitude part during decoding, and use "smallest possible" type
> >>>> for integral numbers, from group of `int`, `long` and `BigInteger`
> >>>> (for floating-point logic is bit different, but similar idea
> applies).
> >>>> Problem occurs when target type needed by databinding is something
> >>>> else: like very long integer number that is to be used for filling
> >>>> `int` field. This operation is slow with JDK, and should be avoided
> >>>> partly because overflow check would fail anyway -- but this is only
> >>>> applied after very slow conversion, allowing DoS attacks.
> >>>>
> >>>> I have some questions on how this could and should be handled,
> >>>> regarding things like:
> >>>>
> >>>> 1. On "too big" (big magnitude) number, should we typically truncate
> >>>> to MAX_VALUE (for `double`), or throw exception (latter for integral
> I
> >>>> think)
> >>>> 2. On "too small" (small magnitude) number, should we truncate to
> zero
> >>>> 3. If applying strict limits to longest BigInteger/BigDecimal, are
> >>>> there safe length limits? Same use cases (like cryptography) use
> >>>> relatively long numbers legitimately, for example
> >>>>
> >>>> But. Maybe I can figure out solution to bounds-check-fail case at
> least, first.
> >>>>
> >>>> -+ Tatu +-
> >>>>
> >>>> ps. This is not limited to json either; almost certainly applicable
> to
> >>>> XML, YAML, possibly CSV, Properties. So I think help would be useful
> >>>> in figuring out extent of the problem.
> >>>
> >>> --
> >>> You received this message because you are subscribed to the Google
> Groups "jackson-user" group.
> >>> To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> >>> To post to this group, send email to [email protected].
> >>> For more options, visit https://groups.google.com/d/optout.
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "jackson-user" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected] <javascript:>.
> > To post to this group, send email to [email protected]
> <javascript:>.
> > For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.