键盘和鼠标失灵了 + content-security-policy 错误

我正在运行 Discourse 的自托管实例 forum.embeetle.com。它已经运行了好几年了。

今天早上,我注意到浏览器中与论坛的所有键盘和鼠标交互都停止工作了。我可以加载论坛的任何页面,但无法滚动、登录、搜索……

我尝试了 Firefox 和 Chromium:问题相同。

Firefox 开发者工具显示此错误:

Content-Security-Policy: 页面设置阻止了内联资源(“script-src”)的加载。forum.embeetle.com:362:10

我最近没有进行任何更新或安装任何新插件。

有什么建议可以帮助我调试和修复这个问题吗?

据我所知,我有一个标准的基于 docker 的安装,除了我将它运行在一个 Nginx 反向代理后面。Nginx 配置如下(不确定它是否相关):

server {
    server_name forum.embeetle.com;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/embeetle/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/embeetle/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    access_log /var/log/nginx/forum.embeetle.access.log;
    error_log /var/log/nginx/forum.embeetle.error.log;

    location / {
         proxy_pass http://unix:/srv/embeetle_forum/discourse/shared/standalone/nginx.http.sock:;
         proxy_set_header Host $http_host;
         proxy_http_version 1.1;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
        error_page 502 =502 /error/offline.html;
        proxy_intercept_errors on;
     }

     location /error/ {
         alias /srv/embeetle_forum/error/;
     }
}

server {
    server_name forum.embeetle.com;
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

您的网站在禁用主题的安全模式下似乎运行正常。

你说得对。

我不记得曾经默认设置过主题,但也许我设置过然后忘记了。

我想暂时禁用默认主题,这样我们的论坛就可以使用了,同时我们也能找出主题出了什么问题。如果我只能在禁用主题的情况下访问管理页面,我该怎么做?在安全模式下,所有主题都已禁用,启用然后重新禁用它们似乎没有效果。

有三个可用主题(见下文)。没有一个默认启用。

另外,在安全模式下没有 Content-Security-Policy 错误。

奇怪,在我使用的 Safari 浏览器中,它报告无法执行第 315 行。那是 Discourse-spash 预加载器的内联脚本。所以与主题无关。

作为即时修复,您可以使用站点设置禁用 CSP:
Screenshot 2023-11-06 at 14.24.11

只是猜测:如果问题仍然存在,可能是您的服务器环境发送了意外的内容。或者有其他脚本在干扰(您是否运行了任何自定义插件或其他脚本?)

请注意,这将使您处于易受攻击的状态,应尽快解决。但至少您的论坛又能正常工作了。

是的,这正是我遇到的情况。

我现在已经通过在 nginx 配置(服务器级别)中添加重写来实现了一个不同的解决方法:

    rewrite ^(.*)$ $1?safe_mode=no_themes break;

因此,访问者现在将默认使用安全模式。

为了进一步探讨这个问题,我还复制了一个没有 rewrite 的论坛服务器,地址是 https://raw.forum.embeetle.com。如果您访问该 URL,您仍然会看到原始问题。

我没有使用任何自定义脚本。我正在使用一些插件,如果禁用任何插件会产生影响,我会进行实验。

我正在使用的插件如下:

chat 已经被禁用。

我尝试禁用 discourse-mathfootnotespoiler-alert;问题依然存在。

找到了:问题确实出在我的 nginx 配置上,该配置意外地发出了一条过于严格的 Content-Security-Policy 标头,不适用于 Discourse。

删除 Content-Security-Policy 解决了我的问题。

3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.