{"record":{"id":"9ec60961c51a86ac","repo":"infiniflow/ragflow","slug":"database-host-self-param-host-is-not-allowed","errorCode":null,"errorMessage":"Database host '{self._param.host}' is not allowed: {e}","messagePattern":"Database host '(.+?)' is not allowed: (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"agent/tools/exesql.py","lineNumber":127,"sourceCode":"                except Exception:\n                    args[k] = str(args[k])\n            self.set_input_value(k, args[k])\n        sql = self.string_format(sql, args)\n\n        if self.check_if_canceled(\"ExeSQL processing\"):\n            return\n\n        # The DB host/port are node-author-controlled and are connected to\n        # server-side, so guard against SSRF (internal hosts, loopback, cloud\n        # metadata) the same way the `test_db_connection` endpoint does. Connect\n        # to the validated, resolved public IP so a later DNS change cannot\n        # rebind the host to an internal address (mirrors agent_api.py).\n        logging.info(f\"ExeSQL validating database host: {self._param.host}\")\n        try:\n            safe_host = assert_host_is_safe(self._param.host)\n        except ValueError as e:\n            logging.warning(f\"ExeSQL rejected database host {self._param.host}: {e}\")\n            raise Exception(f\"Database host '{self._param.host}' is not allowed: {e}\")\n        logging.info(f\"ExeSQL validated database host {self._param.host} -> {safe_host}\")\n\n        sqls = sql.split(\";\")\n        if self._param.db_type in [\"mysql\", \"mariadb\"]:\n            db = pymysql.connect(db=self._param.database, user=self._param.username, host=safe_host, port=self._param.port, password=self._param.password)\n        elif self._param.db_type == \"oceanbase\":\n            db = pymysql.connect(db=self._param.database, user=self._param.username, host=safe_host, port=self._param.port, password=self._param.password, charset=\"utf8mb4\")\n        elif self._param.db_type == \"postgres\":\n            db = psycopg2.connect(dbname=self._param.database, user=self._param.username, host=safe_host, port=self._param.port, password=self._param.password)\n        elif self._param.db_type == \"mssql\":\n            conn_str = (\n                r\"DRIVER={ODBC Driver 17 for SQL Server};\"\n                r\"SERVER=\" + safe_host + \",\" + str(self._param.port) + \";\"\n                r\"DATABASE=\" + self._param.database + \";\"\n                r\"UID=\" + self._param.username + \";\"\n                r\"PWD=\" + self._param.password\n            )\n            db = pyodbc.connect(conn_str)","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/agent/tools/exesql.py#L109-L145","documentation":"Error \"Database host '{self._param.host}' is not allowed: {e}\" thrown in infiniflow/ragflow.","triggerScenarios":"Thrown at agent/tools/exesql.py:127 when the library encounters an invalid state.","commonSituations":"The configured database host resolves to a blocked address (loopback, link-local, or cloud metadata endpoints) under the SSRF guard; using an allowed host prevents this error.","solutions":["Use a database host that is permitted by the allowlist/SSRF policy.","If the host is legitimate, add it to the allowed hosts configuration."],"exampleFix":"host = 'db.internal.example.com'  # allowed host, not 127.0.0.1 or metadata IPs","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}