Răsfoiți Sursa

add defensive checks against data being funny (#4633)

Khaleel Al-Adhami 4 luni în urmă
părinte
comite
4dc106545b
2 a modificat fișierele cu 32 adăugiri și 2 ștergeri
  1. 28 2
      reflex/app.py
  2. 4 0
      reflex/utils/exceptions.py

+ 28 - 2
reflex/app.py

@@ -1557,10 +1557,36 @@ class EventNamespace(AsyncNamespace):
         Args:
         Args:
             sid: The Socket.IO session id.
             sid: The Socket.IO session id.
             data: The event data.
             data: The event data.
+
+        Raises:
+            EventDeserializationError: If the event data is not a dictionary.
         """
         """
         fields = data
         fields = data
-        # Get the event.
-        event = Event(**{k: v for k, v in fields.items() if k in _EVENT_FIELDS})
+
+        if isinstance(fields, str):
+            console.warn(
+                "Received event data as a string. This generally should not happen and may indicate a bug."
+                f" Event data: {fields}"
+            )
+            try:
+                fields = json.loads(fields)
+            except json.JSONDecodeError as ex:
+                raise exceptions.EventDeserializationError(
+                    f"Failed to deserialize event data: {fields}."
+                ) from ex
+
+        if not isinstance(fields, dict):
+            raise exceptions.EventDeserializationError(
+                f"Event data must be a dictionary, but received {fields} of type {type(fields)}."
+            )
+
+        try:
+            # Get the event.
+            event = Event(**{k: v for k, v in fields.items() if k in _EVENT_FIELDS})
+        except (TypeError, ValueError) as ex:
+            raise exceptions.EventDeserializationError(
+                f"Failed to deserialize event data: {fields}."
+            ) from ex
 
 
         self.token_to_sid[event.token] = sid
         self.token_to_sid[event.token] = sid
         self.sid_to_token[sid] = event.token
         self.sid_to_token[sid] = event.token

+ 4 - 0
reflex/utils/exceptions.py

@@ -187,6 +187,10 @@ class SystemPackageMissingError(ReflexError):
     """Raised when a system package is missing."""
     """Raised when a system package is missing."""
 
 
 
 
+class EventDeserializationError(ReflexError, ValueError):
+    """Raised when an event cannot be deserialized."""
+
+
 def raise_system_package_missing_error(package: str) -> NoReturn:
 def raise_system_package_missing_error(package: str) -> NoReturn:
     """Raise a SystemPackageMissingError.
     """Raise a SystemPackageMissingError.