{"record":{"id":"0b6214e812a6e94c","repo":"mem0ai/mem0","slug":"invalid-filter-key-key-r-0b6214","errorCode":null,"errorMessage":"Invalid filter key: {key!r}","messagePattern":"Invalid filter key: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mem0/vector_stores/milvus.py","lineNumber":161,"sourceCode":"\n        data = [_build_record(idx, embedding, metadata) for idx, embedding, metadata in zip(ids, vectors, payloads)]\n        self.client.insert(collection_name=self.collection_name, data=data, **kwargs)\n\n    _SAFE_FILTER_KEY = re.compile(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\")\n\n    def _create_filter(self, filters: dict):\n        \"\"\"Prepare filters for efficient query.\n\n        Args:\n            filters (dict): filters [user_id, agent_id, run_id]\n\n        Returns:\n            str: formated filter.\n        \"\"\"\n        operands = []\n        for key, value in filters.items():\n            if not self._SAFE_FILTER_KEY.match(key):\n                raise ValueError(f\"Invalid filter key: {key!r}\")\n            if value == \"*\":\n                # Wildcard - match any value (MilvusDB doesn't have direct wildcard, so we skip this filter)\n                continue\n            elif isinstance(value, str):\n                escaped = value.replace(\"\\\\\", \"\\\\\\\\\").replace('\"', '\\\\\"')\n                operands.append(f'(metadata[\"{key}\"] == \"{escaped}\")')\n            elif isinstance(value, (int, float, bool)):\n                operands.append(f'(metadata[\"{key}\"] == {value})')\n            else:\n                raise ValueError(\n                    f\"Filter value for {key!r} must be str, int, float, or bool, \"\n                    f\"got {type(value).__name__}\"\n                )\n\n        return \" and \".join(operands)\n\n    def _parse_output(self, data: list):\n        \"\"\"","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0/vector_stores/milvus.py#L143-L179","documentation":"Milvus._create_filter() rejects filter keys that do not match _SAFE_FILTER_KEY (an identifier-safe regex) before interpolating them into a Milvus filter expression string. This is SQL-injection-style protection for the expression language: arbitrary key bytes could break out of the metadata[\"key\"] quoting.","triggerScenarios":"Passing filters with keys containing quotes, brackets, spaces, or expression operators — e.g. filters={'user_id\" == \"x': 1} or keys built from untrusted user input like {'run_id; drop': 'abc'}.","commonSituations":"Passing raw user-supplied JSON as the filters dict; filter keys containing hyphens or dots; constructing nested filter dicts (lists/dicts as keys after str()).","solutions":["Whitelist filter keys on your side: only allow known keys such as user_id, agent_id, run_id","Sanitize/normalize keys to [A-Za-z0-9_] before calling search with filters","Never pass untrusted input unmodified in the filters dict"],"exampleFix":"# before\nfilters = {raw_user_key: raw_user_value}  # raw_user_key = 'user_id\" or \"1'\nresults = m.search('query', filters=filters)\n\n# after\nimport re\nSAFE = re.compile(r'^[A-Za-z0-9_]+$')\nfilters = {k: v for k, v in raw_filters.items() if SAFE.match(k)}\nresults = m.search('query', filters=filters)","handlingStrategy":"validation","validationCode":"import re\nSAFE_KEY = re.compile(r'^[A-Za-z0-9_]+$')\nALLOWED = {'user_id', 'agent_id', 'run_id'}\n\ndef safe_filters(filters):\n    return {k: v for k, v in (filters or {}).items() if k in ALLOWED and SAFE_KEY.match(k)}","typeGuard":"def is_safe_filter_key(key) -> bool:\n    import re\n    return isinstance(key, str) and re.match(r'^[A-Za-z0-9_]+$', key) is not None","tryCatchPattern":"try:\n    m.search('query', filters=filters)\nexcept ValueError as e:\n    if 'Invalid filter key' in str(e):\n        # strip offending keys and retry with sanitized filters\n        raise","preventionTips":["Whitelist filter keys at the API boundary — never forward untrusted keys","Keep filter keys to identifier characters ([A-Za-z0-9_])","Log rejected filter keys to detect injection attempts"],"tags":["milvus","security","injection","filters","validation"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}