2011-07-31 12 views

Odpowiedz

7

Pomoże to w rozbiciu na dwa wyrażenia. params.max ? params.int('max') : 10 jest potrójnym wyrażeniem ... którego wynik kończy się jako pierwszy argument do Math.min (z innym argumentem jest 100).

Wygląda na końcowy wynik jest liczbą całkowitą, która jest ograniczona do bycia co najwyżej 100, domyślnie 10.

+0

Dobra, rozumiem. Tęskniłem za tym. Dzięki – Ray

14

Czy teraz jasne?

def max = params.max? params.int('max') : 10 
Math.min(max, 100) 

BTW jest to miłe idiom popularny w Grails - jeśli istnieje parametr max, czytać, ale jeśli przekracza określonej wartości (100 domyślnie), obciąć je 100. W ten sposób atakujący lub złośliwy użytkownik nie sprawi, że aplikacja zwróci dowolnie dużą ilość danych z bazy danych.

+0

Rozumiem, dziękuję za wyjaśnienie znaczenia ograniczenia tego dla atakujących strony. – Ray

0

Podczas ochrony przed atakiem możesz również spojrzeć na dolne krawędzie. Właśnie natknąłem się na to w grailsach 2.4.4: Wszystko poniżej 1 wydaje się zwracać wszystkie rekordy. Nie jest to udokumentowane, a źródło wydaje się sprawdzać wartości> -1, ale musiałem sprawdzić wartości> 0:

//Use value, if found, else 20 
int max = params.getInt('max') ?: 20 

//no less than 1, no more than 100: max < 1 returns ALL records (grails 2.4.4) 
max = Math.max(max, 1) 
max = Math.min(max, 100) 

Domain.list(max: max)