{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 81,
"content": "<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/betrieb\">Betrieb<\/a> » DB Hooks\n<\/nav>\n\n<h1>DB Hooks<\/h1>\n<p class=\"doc-meta\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\n\n<p>Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.<\/p>\n\n<table>\n <tr><th>Pfad<\/th><td>\/var\/www\/scripts\/hooks\/<\/td><\/tr>\n <tr><th>Hook-Typ<\/th><td>PreToolUse (Bash)<\/td><\/tr>\n <tr><th>Verhalten<\/th><td>Blocking (Exit 1 bei Violation)<\/td><\/tr>\n<\/table>\n\n<h2>Übersicht<\/h2>\n<table>\n <tr><th>Hook<\/th><th>Blockiert<\/th><th>Empfehlung<\/th><\/tr>\n <tr><td>block_direct_db.py<\/td><td>mysql\/mariadb mit Passwort<\/td><td>MCP-DB Tools<\/td><\/tr>\n <tr><td>block_direct_task_db.py<\/td><td>INSERT\/UPDATE\/DELETE auf Task-Tabellen<\/td><td>MCP-Tasks Tools<\/td><\/tr>\n <tr><td>block_password_exposure.py<\/td><td>Passwörter im Klartext in Bash-Commands<\/td><td>Environment-Variablen<\/td><\/tr>\n<\/table>\n\n<h2>block_direct_db.py<\/h2>\n<p>Verhindert Bash-Befehle mit direktem Datenbank-Login.<\/p>\n\n<h3>Blockierte Patterns<\/h3>\n<pre><code>mysql -u user -ppassword\nmariadb -u user -p\nmysql --password=xxx\nmariadb --password=xxx<\/code><\/pre>\n\n<h3>Fehlermeldung<\/h3>\n<pre><code>BLOCKIERT: Direkte Datenbankzugriffe sind aus Sicherheitsgründen nicht erlaubt.\n\nVerwende stattdessen die MCP-DB Tools:\n - db_select(query, params) : SELECT-Abfragen ausführen\n - db_schema() : Datenbank-Schema anzeigen\n - db_stats() : Statistiken abrufen\n\nVorteile von MCP-DB:\n - Keine Credentials im Code\/Verlauf\n - Automatische Query-Validierung\n - SQL-Injection Schutz\n - Audit-Logging aller Abfragen\n - Enforced Read-Only Zugriff<\/code><\/pre>\n\n<h2>block_direct_task_db.py<\/h2>\n<p>Verhindert direkte SQL-Operationen auf Task-Tabellen.<\/p>\n\n<h3>Blockierte Patterns<\/h3>\n<pre><code>INSERT INTO tasks ...\nUPDATE tasks SET ...\nDELETE FROM tasks ...\nINSERT INTO task_assignments ...\nUPDATE task_results ...\nDELETE FROM task_comments ...<\/code><\/pre>\n\n<h3>Fehlermeldung<\/h3>\n<pre><code>BLOCKIERT: Direkte SQL-Operationen auf Task-Tabellen sind nicht erlaubt.\n\nVerwende stattdessen die MCP-Tasks Tools:\n - tasks_list() : Tasks auflisten\n - tasks_create(title, ...) : Task erstellen\n - tasks_get(id) : Task-Details abrufen\n - tasks_update(id, ...) : Task aktualisieren\n - tasks_status(id, status) : Status ändern\n - tasks_assign(id, ...) : Task zuweisen\n - tasks_result(id, ...) : Ergebnis speichern\n - tasks_execute(id, model) : Mit Ollama ausführen<\/code><\/pre>\n\n<h2>block_password_exposure.py<\/h2>\n<p>Verhindert Passwort-Exposition in Bash-Commands. Passwörter im Klartext sind sichtbar in ps aux, \/proc\/*\/cmdline, bash_history und Logs.<\/p>\n\n<h3>Blockierte Patterns<\/h3>\n<pre><code>DB_PASSWORD=\"wert\"\nMARIADB_ROOT_PASSWORD=\"wert\"\nAPI_KEY=\"wert\"\nTOKEN=\"wert\"\nSECRET=\"wert\"\n--password=wert<\/code><\/pre>\n\n<h3>Erlaubte Patterns<\/h3>\n<pre><code>$DB_PASSWORD # Variable verwenden\n${DB_PASSWORD} # Variable verwenden\nDB_PASSWORD=\"\" # Leere Zuweisung\nget_db_password() # Getter-Funktion<\/code><\/pre>\n\n<h3>Fehlermeldung<\/h3>\n<pre><code>BLOCKIERT: Passwort-Exposition im Bash-Command erkannt!\n\nRICHTIG: Passwort aus Environment laden\n .\/venv\/bin\/python script.py\n # Script lädt Passwort via get_db_password()\n\nFALSCH:\n DB_PASSWORD=\"xxx\" .\/venv\/bin\/python script.py<\/code><\/pre>\n\n<h2>Verhalten<\/h2>\n\n<h3>Erfolg (erlaubt)<\/h3>\n<pre><code>{\n \"allowed\": true,\n \"message\": \"\"\n}\nExit Code: 0<\/code><\/pre>\n\n<h3>Blockiert<\/h3>\n<pre><code>{\n \"hookSpecificOutput\": {\n \"hookEventName\": \"PreToolUse\",\n \"permissionDecision\": \"deny\",\n \"permissionDecisionReason\": \"BLOCKIERT: ...\"\n }\n}\nExit Code: 1<\/code><\/pre>\n\n<h3>Fehler (Fail-Open)<\/h3>\n<pre><code>{\n \"allowed\": true,\n \"message\": \"Hook error (fail-open): ...\"\n}\nExit Code: 0<\/code><\/pre>\n\n<h2>Konfiguration<\/h2>\n<p>In <code>\/root\/.claude\/settings.json<\/code>:<\/p>\n<pre><code>{\n \"hooks\": {\n \"PreToolUse\": [\n {\n \"matcher\": \"Bash\",\n \"hooks\": [\n {\"type\": \"command\", \"command\": \"\/var\/www\/scripts\/hooks\/block_direct_db.py\"},\n {\"type\": \"command\", \"command\": \"\/var\/www\/scripts\/hooks\/block_direct_task_db.py\"},\n {\"type\": \"command\", \"command\": \"\/var\/www\/scripts\/hooks\/block_password_exposure.py\"}\n ]\n }\n ]\n }\n}<\/code><\/pre>\n\n<h2>Sicherheitskonzept<\/h2>\n<pre><code>┌─────────────────────────────────────────────┐\n│ Claude Code │\n│ └─ Bash Tool → mysql -u root -p... │\n└─────────────────────────────────────────────┘\n ↓\n┌─────────────────────────────────────────────┐\n│ PreToolUse Hook │\n│ ├─ block_direct_db.py │\n│ ├─ block_direct_task_db.py │\n│ └─ block_password_exposure.py │\n│ └─ Pattern Match? → BLOCK (Exit 1) │\n└─────────────────────────────────────────────┘\n ↓\n┌─────────────────────────────────────────────┐\n│ MCP-Server (stattdessen) │\n│ ├─ MCP-DB: db_select(), db_schema() │\n│ └─ MCP-Tasks: tasks_*(), quality_*() │\n└─────────────────────────────────────────────┘<\/code><\/pre>\n\n<h2>Verwandte Dokumentation<\/h2>\n<ul>\n <li><a href=\"\/docs\/mcp\/mcp-db\">MCP-DB Server<\/a><\/li>\n <li><a href=\"\/docs\/mcp\/mcp-tasks\">MCP-Tasks Server<\/a><\/li>\n <li><a href=\"\/docs\/betrieb\/claude-hooks\">Claude Hooks<\/a><\/li>\n<\/ul>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 81,\n \"parent_id\": 55,\n \"slug\": \"db-hooks\",\n \"path\": \"\/betrieb\/db-hooks\",\n \"title\": \"DB Hooks\",\n \"description\": \"Security-Hooks zum Blockieren direkter Datenbankzugriffe\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/betrieb\\\">Betrieb<\/a> » DB Hooks\\n<\/nav>\\n\\n<h1>DB Hooks<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\\n\\n<p>Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.<\/p>\\n\\n<table>\\n <tr><th>Pfad<\/th><td>\/var\/www\/scripts\/hooks\/<\/td><\/tr>\\n <tr><th>Hook-Typ<\/th><td>PreToolUse (Bash)<\/td><\/tr>\\n <tr><th>Verhalten<\/th><td>Blocking (Exit 1 bei Violation)<\/td><\/tr>\\n<\/table>\\n\\n<h2>Übersicht<\/h2>\\n<table>\\n <tr><th>Hook<\/th><th>Blockiert<\/th><th>Empfehlung<\/th><\/tr>\\n <tr><td>block_direct_db.py<\/td><td>mysql\/mariadb mit Passwort<\/td><td>MCP-DB Tools<\/td><\/tr>\\n <tr><td>block_direct_task_db.py<\/td><td>INSERT\/UPDATE\/DELETE auf Task-Tabellen<\/td><td>MCP-Tasks Tools<\/td><\/tr>\\n <tr><td>block_password_exposure.py<\/td><td>Passwörter im Klartext in Bash-Commands<\/td><td>Environment-Variablen<\/td><\/tr>\\n<\/table>\\n\\n<h2>block_direct_db.py<\/h2>\\n<p>Verhindert Bash-Befehle mit direktem Datenbank-Login.<\/p>\\n\\n<h3>Blockierte Patterns<\/h3>\\n<pre><code>mysql -u user -ppassword\\nmariadb -u user -p\\nmysql --password=xxx\\nmariadb --password=xxx<\/code><\/pre>\\n\\n<h3>Fehlermeldung<\/h3>\\n<pre><code>BLOCKIERT: Direkte Datenbankzugriffe sind aus Sicherheitsgründen nicht erlaubt.\\n\\nVerwende stattdessen die MCP-DB Tools:\\n - db_select(query, params) : SELECT-Abfragen ausführen\\n - db_schema() : Datenbank-Schema anzeigen\\n - db_stats() : Statistiken abrufen\\n\\nVorteile von MCP-DB:\\n - Keine Credentials im Code\/Verlauf\\n - Automatische Query-Validierung\\n - SQL-Injection Schutz\\n - Audit-Logging aller Abfragen\\n - Enforced Read-Only Zugriff<\/code><\/pre>\\n\\n<h2>block_direct_task_db.py<\/h2>\\n<p>Verhindert direkte SQL-Operationen auf Task-Tabellen.<\/p>\\n\\n<h3>Blockierte Patterns<\/h3>\\n<pre><code>INSERT INTO tasks ...\\nUPDATE tasks SET ...\\nDELETE FROM tasks ...\\nINSERT INTO task_assignments ...\\nUPDATE task_results ...\\nDELETE FROM task_comments ...<\/code><\/pre>\\n\\n<h3>Fehlermeldung<\/h3>\\n<pre><code>BLOCKIERT: Direkte SQL-Operationen auf Task-Tabellen sind nicht erlaubt.\\n\\nVerwende stattdessen die MCP-Tasks Tools:\\n - tasks_list() : Tasks auflisten\\n - tasks_create(title, ...) : Task erstellen\\n - tasks_get(id) : Task-Details abrufen\\n - tasks_update(id, ...) : Task aktualisieren\\n - tasks_status(id, status) : Status ändern\\n - tasks_assign(id, ...) : Task zuweisen\\n - tasks_result(id, ...) : Ergebnis speichern\\n - tasks_execute(id, model) : Mit Ollama ausführen<\/code><\/pre>\\n\\n<h2>block_password_exposure.py<\/h2>\\n<p>Verhindert Passwort-Exposition in Bash-Commands. Passwörter im Klartext sind sichtbar in ps aux, \/proc\/*\/cmdline, bash_history und Logs.<\/p>\\n\\n<h3>Blockierte Patterns<\/h3>\\n<pre><code>DB_PASSWORD=\\\"wert\\\"\\nMARIADB_ROOT_PASSWORD=\\\"wert\\\"\\nAPI_KEY=\\\"wert\\\"\\nTOKEN=\\\"wert\\\"\\nSECRET=\\\"wert\\\"\\n--password=wert<\/code><\/pre>\\n\\n<h3>Erlaubte Patterns<\/h3>\\n<pre><code>$DB_PASSWORD # Variable verwenden\\n${DB_PASSWORD} # Variable verwenden\\nDB_PASSWORD=\\\"\\\" # Leere Zuweisung\\nget_db_password() # Getter-Funktion<\/code><\/pre>\\n\\n<h3>Fehlermeldung<\/h3>\\n<pre><code>BLOCKIERT: Passwort-Exposition im Bash-Command erkannt!\\n\\nRICHTIG: Passwort aus Environment laden\\n .\/venv\/bin\/python script.py\\n # Script lädt Passwort via get_db_password()\\n\\nFALSCH:\\n DB_PASSWORD=\\\"xxx\\\" .\/venv\/bin\/python script.py<\/code><\/pre>\\n\\n<h2>Verhalten<\/h2>\\n\\n<h3>Erfolg (erlaubt)<\/h3>\\n<pre><code>{\\n \\\"allowed\\\": true,\\n \\\"message\\\": \\\"\\\"\\n}\\nExit Code: 0<\/code><\/pre>\\n\\n<h3>Blockiert<\/h3>\\n<pre><code>{\\n \\\"hookSpecificOutput\\\": {\\n \\\"hookEventName\\\": \\\"PreToolUse\\\",\\n \\\"permissionDecision\\\": \\\"deny\\\",\\n \\\"permissionDecisionReason\\\": \\\"BLOCKIERT: ...\\\"\\n }\\n}\\nExit Code: 1<\/code><\/pre>\\n\\n<h3>Fehler (Fail-Open)<\/h3>\\n<pre><code>{\\n \\\"allowed\\\": true,\\n \\\"message\\\": \\\"Hook error (fail-open): ...\\\"\\n}\\nExit Code: 0<\/code><\/pre>\\n\\n<h2>Konfiguration<\/h2>\\n<p>In <code>\/root\/.claude\/settings.json<\/code>:<\/p>\\n<pre><code>{\\n \\\"hooks\\\": {\\n \\\"PreToolUse\\\": [\\n {\\n \\\"matcher\\\": \\\"Bash\\\",\\n \\\"hooks\\\": [\\n {\\\"type\\\": \\\"command\\\", \\\"command\\\": \\\"\/var\/www\/scripts\/hooks\/block_direct_db.py\\\"},\\n {\\\"type\\\": \\\"command\\\", \\\"command\\\": \\\"\/var\/www\/scripts\/hooks\/block_direct_task_db.py\\\"},\\n {\\\"type\\\": \\\"command\\\", \\\"command\\\": \\\"\/var\/www\/scripts\/hooks\/block_password_exposure.py\\\"}\\n ]\\n }\\n ]\\n }\\n}<\/code><\/pre>\\n\\n<h2>Sicherheitskonzept<\/h2>\\n<pre><code>┌─────────────────────────────────────────────┐\\n│ Claude Code │\\n│ └─ Bash Tool → mysql -u root -p... │\\n└─────────────────────────────────────────────┘\\n ↓\\n┌─────────────────────────────────────────────┐\\n│ PreToolUse Hook │\\n│ ├─ block_direct_db.py │\\n│ ├─ block_direct_task_db.py │\\n│ └─ block_password_exposure.py │\\n│ └─ Pattern Match? → BLOCK (Exit 1) │\\n└─────────────────────────────────────────────┘\\n ↓\\n┌─────────────────────────────────────────────┐\\n│ MCP-Server (stattdessen) │\\n│ ├─ MCP-DB: db_select(), db_schema() │\\n│ └─ MCP-Tasks: tasks_*(), quality_*() │\\n└─────────────────────────────────────────────┘<\/code><\/pre>\\n\\n<h2>Verwandte Dokumentation<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\\\">MCP-DB Server<\/a><\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-tasks\\\">MCP-Tasks Server<\/a><\/li>\\n <li><a href=\\\"\/docs\/betrieb\/claude-hooks\\\">Claude Hooks<\/a><\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 7,\n \"depth\": 1,\n \"created_at\": \"2025-12-20T13:41:35\",\n \"updated_at\": \"2025-12-31T04:06:48\"\n },\n \"message\": \"Document #81 updated\"\n}"
}
]
}