Mini-Profiler löst 403 beim Versuch aus, einen Entwurf bei der Bearbeitung von PN zu speichern

Seit dem Update auf v2026.8.0-latest +28 (von einer v2026.7-Version) sehe ich als “Entwickler” beim Bearbeiten einer PN

{52B46C2B-8166-4B02-92C9-936558B256BA}

In der Browserkonsole sehe ich:

20:54:29.425 includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840  POST https://dietpi.com/forum/drafts.json 403 (Forbidden)
(anonymous) @ includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840
send @ jquery.js:9940
ajax @ jquery.js:9521
i @ ajax.js:233
Z @ ajax.js:252
save @ draft.js:37
saveDraft @ composer.js:1535
_saveDraft @ composer.js:1963
_shouldSaveDraft @ composer.js:1999
sendEvent @ cache-DtDz7X5V.js:471
(anonymous) @ cache-DtDz7X5V.js:665
invoke @ index.js:262
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-DaCZcoCY.js:4146
dirtyTag @ index.js:229
dirtyTagFor @ index.js:848
setter @ index.js:871
set @ cache-DtDz7X5V.js:1886
_setProp @ property_set-n9lAuzYY.js:47
set @ property_set-n9lAuzYY.js:42
(anonymous) @ set_properties-D2_u0phU.js:94
changeProperties @ cache-DtDz7X5V.js:802
(anonymous) @ set_properties-D2_u0phU.js:88
setProperties @ observable.js:30
_hydrate @ store.js:446
_hydrateFindResults @ store.js:106
(anonymous) @ store.js:124
Promise.then
find @ store.js:123
(anonymous) @ composer.js:1110
mu @ rsvp-ziM3qQyS.js:412
(anonymous) @ rsvp-ziM3qQyS.js:468
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gts:212
click @ d-button.gts:166
20:54:31.380 includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840  POST https://dietpi.com/forum/drafts.json 403 (Forbidden)
(anonymous) @ includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840
send @ jquery.js:9940
ajax @ jquery.js:9521
i @ ajax.js:233
Z @ ajax.js:252
save @ draft.js:37
saveDraft @ composer.js:1535
_saveDraft @ composer.js:1963
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
debounce @ index.js:680
debounce @ index.js:713
(anonymous) @ debounce.js:26
debouncedRecalculateHeaderOffset @ glimmer-site-header.gjs:96
_run @ index.js:804
_join @ index.js:783
join @ index.js:605
join @ index.js:152
(anonymous) @ index.js:250
20:54:34.397 7:1 Die Ressource https://dietpi.com/matomo/matomo.js wurde mit Link-Preload vorab geladen, aber nicht innerhalb weniger Sekunden nach dem Load-Ereignis des Fensters verwendet. Bitte stelle sicher, dass sie einen passenden `as`-Wert hat und absichtlich vorab geladen wird.
20:54:39.457 7:1 Die Ressource https://dietpi.com/matomo/matomo.js wurde mit Link-Preload vorab geladen, aber nicht innerhalb weniger Sekunden nach dem Load-Ereignis des Fensters verwendet. Bitte stelle sicher, dass sie einen passenden `as`-Wert hat und absichtlich vorab geladen wird.

Dieser 403-Fehler scheint vom Mini-Profiler zu stammen:

    if (!window.MiniProfiler || !window.MiniProfiler.patchesApplied) {
      var send = XMLHttpRequest.prototype.send;

      XMLHttpRequest.prototype.send = function(data) {
        ajaxStartTime = new Date();
        this.addEventListener("load", function() {
          // responseURL isn't available in IE11
          if (
            this.responseURL &&
            this.responseURL.indexOf(window.location.origin) !== 0
          ) {
            return;
          }
          if (this.__miniProfilerSkipResultsFetch) {
            return;
          }
          // getAllResponseHeaders isn't available in Edge.
          var allHeaders = this.getAllResponseHeaders
            ? this.getAllResponseHeaders()
            : null;
          if (
            allHeaders &&
            allHeaders.toLowerCase().indexOf("x-miniprofiler-ids") === -1
          ) {
            return;
          }
          // should be a string of comma-separated ids
          var stringIds = this.getResponseHeader("X-MiniProfiler-Ids");

          if (stringIds) {
            var ids = stringIds.split(",");
            fetchResults(ids);
          }
        });
        send.call(this, data);
      }; // fetch results after ASP Ajax calls

Das send.call(this, data) ist das, was den 403-Fehler beim Versuch eines POSTs an drafts.json empfängt, soweit ich das verstehe. Ich vermute, die data ist ungültig und verursacht den 403-Fehler. Es gibt keine Informationen im Browser über eine CSP- oder andere Sicherheitsrichtlinie/Headers, die eine Anfrage blockieren.

Dies tritt nicht auf, wenn ich einen öffentlichen Beitrag bearbeite oder einer Unterhaltung eine neue PN hinzufüge, sondern nur beim Bearbeiten eines Beitrags in einer PN-Unterhaltung.

Das Ausblenden des Profilers über ALT+P verhindert dies nicht. Ich sollte es wahrscheinlich als Nicht-Entwickler-Benutzer testen.

Wahrscheinlich schlägt das Speichern der Bearbeitung infolge dieses Fehlers ebenfalls fehl, da die Daten kein gültiges JSON sind.

Wir verwenden das offizielle Docker-Image, führen es aber, wie zu sehen, hinter einem Proxy (Apache2) auf dem /forum-Subpfad aus. Wahrscheinlich hat dies einen Einfluss.

Ah, es war nur ein falscher Alarm der Cloudflare-Firewall, Regel 95a84ab1645a49c685648c17761e7a4c aus dem „Cloudflare Managed Ruleset“, falls jemand anderes darauf stößt. Dies ist bereits die siebte Regel aus ihrem Standardsatz, die ich für Discourse deaktivieren musste, da sie JSON-Inhalte – also den Inhalt von Beiträgen – auf bestimmte Muster überprüft. Da ich häufig Shell-Code (und anderen Code) schreibe oder einfüge, werden diese Regeln ausgelöst.

Discourse kann im Allgemeinen ganz ohne WAF-Filterung betrieben werden; der Sicherheitsprozess ist sehr robust und weist im Grunde niemals die Art von Problemen auf, vor denen WAFs schützen sollen.

Das mag richtig sein. Ich bevorzuge jedoch den konservativen Ansatz, einzelne Regeln zu deaktivieren, wenn ich feststelle, dass sie als falsch positiv auslösen. Dieser Fall erinnert mich daran, dies immer zuerst zu prüfen, wenn ich nach einem Discourse-Update oder im Allgemeinen einige 403-Fehler sehe.

Ich stimme jedoch zu: Da dies nur eine von insgesamt sieben (für Discourse) problematischen Regeln war und wir bereits viele standardmäßig aktivierten Regeln domänenweit für Software, die wir nicht verwenden, deaktiviert haben, ist das Feintuning damit eine kontinuierliche Wartungsaufgabe. Für die meisten Administratoren ist es daher wahrscheinlich die einzige praktikable Lösung, die verwalteten WAF-Regeln (für den Discourse-Host/Pfad) vollständig zu deaktivieren.

Zur Vollständigkeit hier die Regeln, die wir ausschließen müssen. Wie zu sehen ist, handelt es sich dabei meist um falsch positive Treffer für Command-Injection, die auf dem Inhalt von Beiträgen basieren: