diff --git a/mo/util.py b/mo/util.py
index a72c5bd6fdf34800d2c58501adec3d719c18aa32..10c2d63896d8f70cb31de877a5a4ced9458a4e7f 100644
--- a/mo/util.py
+++ b/mo/util.py
@@ -13,7 +13,7 @@ import re
 import secrets
 import subprocess
 import sys
-from typing import Any, Optional, NoReturn, Tuple
+from typing import Any, Optional, NoReturn, Tuple, List
 import textwrap
 import urllib.parse
 
@@ -247,3 +247,24 @@ def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, fo
         else:
             return f'Podle nastavení kola zadat body jen s krokem {points_step} (hodnota {points} je neplatná)'
     return None
+
+
+def parse_int_list(a: str, maxim: int = 200) -> List[int]:
+    """Parsuje "1-3,5,7-9" na [1,2,3,5,7,9].
+    Aby nešlo generovat moc velká pole (obrana proti DDoSu),
+    existuje omezení na velikost."""
+    r: List[int] = []
+    for i in a.split(","):
+        b = i.split("-")
+        if len(b) > 2:
+            raise mo.CheckError("Nadměrný počet pomlček")
+        try:
+            c = list(map(int, b))
+        except ValueError:
+            raise mo.CheckError("Převod na číslo se nezdařil")
+        if any(x < 0 or x > maxim for x in c):
+            raise mo.CheckError("Překročen limit na velikost čísla")
+        if len(c) == 2 and c[0] > c[1]:
+            raise mo.CheckError("Větší číslo nemůže být před menším")
+        r += [c[0]] if len(c) == 1 else range(c[0], c[1] + 1)
+    return r