fix(security): headingLevel prüfen, überschreibende Tools kennzeichnen, Meta-Tools auf lit/ beschränken
- Divi-Vollformat: headingLevel nur h1 bis h6 (ValueCleaner, StoredNodeGuard, ShortformWriter); sonst ließ sich für Konten ohne unfiltered_html ein Skript-Element erzeugen. - content-update, divi-update und wp-settings-update sind destructive, damit MCP-Clients nachfragen. - mcp-adapter/execute-ability und get-ability-info nehmen auf dem OAuth-Server nur lit/-Abilities an. - release-publish.sh übergibt den Gitea-Token per Konfigurationsdatei statt als curl-Argument. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
194fd9e183
commit
165e61d7fe
@@ -514,4 +514,20 @@ final class StoredNodeGuardTest extends TestCase
|
||||
self::assertSame([], self::guard(true, true, true)->problems($user));
|
||||
self::assertSame([], self::guard(true, true, true)->problems($private));
|
||||
}
|
||||
|
||||
/** Security audit 2026-11, B1: a copied heading keeps h1 to h6 only – "script" would become an element. */
|
||||
public function testACopiedHeadingTagMustBeH1ToH6(): void
|
||||
{
|
||||
$heading = static fn (string $level): Block => self::block(self::node('divi/heading', ['title' => [
|
||||
'decoration' => ['font' => ['font' => ['desktop' => ['value' => ['headingLevel' => $level]]]]],
|
||||
]]));
|
||||
|
||||
self::assertSame([], self::guard()->problems($heading('h2')));
|
||||
foreach (['script', 'H2', 'h9', 'h2><script>'] as $level) {
|
||||
$problems = self::guard()->problems($heading($level));
|
||||
|
||||
self::assertNotSame([], $problems, $level);
|
||||
self::assertStringContainsString('headingLevel', implode(' | ', $problems));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user