soarli

NextCloud踩坑笔记
引入外部CSS无效默认情况下,引入外部文件会返回“已屏蔽:csp”。经过查询得知,CSP技术常被应用于防止运营商内...
扫描右侧二维码阅读全文
08
2022/02

NextCloud踩坑笔记

引入外部CSS无效

默认情况下,引入外部文件会返回“已屏蔽:csp”。经过查询得知,CSP技术常被应用于防止运营商内容劫持(广告)以及XSS攻击,其可通过以下两种方式使用:

使用方式一:Meta标签

HTMLHead 中添加如下 Meta 标签,将在符合 CSP 标准的浏览器中使非同源的 script 不被加载执行。不支持 CSP 的浏览器将自动会忽略 CSP 的信息,不会有什么影响。具体兼容性如下,获取最新数据可点击这里

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

image-20220208023449733

使用方式二:Http 头部

Content-Security-Policy:
script-src 'unsafe-inline' 'unsafe-eval' 'self'  *.vincentguo.cn *.yunetidc.com *.baidu.com *.cnzz.com *.c-cnzz.com *.duoshuo.com *.jiathis.com;report-uri /error/csp

高级知识:指令集合

指令取值示例说明
default-src'self' cdn.example.com定义针对所有类型(js/image/css/web font/ajax/iframe/多媒体等)资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认。
script-src'self' js.example.com定义针对JavaScript的加载策略
object-src'self'针对,, 等标签的加载策略
style-src'self' css.example.com定义针对样式的加载策略
img-src'self' image.example.com定义针对图片的加载策略
media-src'media.example.com'针对或者引入的html多媒体等标签的加载策略
frame-src'self'针对iframe的加载策略
connect-src'self'针对Ajax、WebSocket等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应
font-srcfont.qq.com针对Web Font的加载策略
sandboxallow-forms allow-scripts对请求的资源启用sandbox
report-uri/some-report-uri告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。不阻止任何内容,可以改用Content-Security-Policy-Report-Only头
base-uri'self'限制当前页面的url(CSP2)
child-src'self'限制子窗口的源(iframe、弹窗等),取代frame-src(CSP2)
form-action'self'限制表单能够提交到的源(CSP2)
frame-ancestors'none'限制了当前页面可以被哪些页面以iframe,frame,object等方式加载(CSP2)
plugin-typesapplication/pdf限制插件的类型(CSP2)

回归主题,经过查阅官方手册得知:

修改/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php中的参数即可放行指定域名下的跨站资源

我的相关配置如下:

image-20220208023851227

手册原文相关部分转载如下:

Modifying the content security policy
By default Nextcloud disables all resources which are not served on the same domain, forbids cross domain requests and disables inline CSS and JavaScript by setting a Content Security Policy. However if an app relies on third-party media or other features which are forbidden by the current policy the policy can be relaxed.

Note

Double check your content and edge cases before you relax the policy! Also read the documentation provided by MDN

To relax the policy pass an instance of the ContentSecurityPolicy class to your response. The methods on the class can be chained.

The following methods turn off security features by passing in true as the $isAllowed parameter

allowInlineScript (bool $isAllowed)
allowInlineStyle (bool $isAllowed)
allowEvalScript (bool $isAllowed)
The following methods whitelist domains by passing in a domain or * for any domain:

addAllowedScriptDomain (string $domain)
addAllowedStyleDomain (string $domain)
addAllowedFontDomain (string $domain)
addAllowedImageDomain (string $domain)
addAllowedConnectDomain (string $domain)
addAllowedMediaDomain (string $domain)
addAllowedObjectDomain (string $domain)
addAllowedFrameDomain (string $domain)
addAllowedChildSrcDomain (string $domain)
The following policy for instance allows images, audio and videos from other domains:

<?php
namespace OCA\MyApp\Controller;

use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\ContentSecurityPolicy;

class PageController extends Controller {

    public function index() {
        $response = new TemplateResponse('myapp', 'main');
        $csp = new ContentSecurityPolicy();
        $csp->addAllowedImageDomain('*');
            ->addAllowedMediaDomain('*');
        $response->setContentSecurityPolicy($csp);
    }

}

经过本地搜索发现原始全局CSS的位置如下:

/apps/theming/css/theming.scss

通过如下方式即可完成CSS的引入:

/*引入soarliall.css*/
@import url("https://open.soarli.top/bysoarli/soarliall.css");

新建用户默认语言改为中文

网站根目录下的config/config.php末尾追加:

// 默认用户为中文
'default_language' => 'zh_CN',
'default_locale' => 'zh',

如未生效,进入下面网址查看对应的缩写。

此外,用户也可以自行调整界面语言,点击右上角的用户头像进入“设置”,在“个人信息”页面修改“语言”和“本地”的语言为中文即可,如下图所示。

image-20220208025311352

管理->概览中扫描到的问题

1.PHP configuration option output_buffering must be disabled

其实这个很好解决,PHP默认是有4096字节缓冲的。但是Nextcloud希望你关闭。如果你是自己安装的PHP,在你安装PHP的路径下,打开PHP配置文件(php.ini),将:

output_buffering = 4096

改为:

; output_buffering = 4096

;为PHP的注释符号

如果你是宝塔安装配置的php,更简单了。在宝塔面板,依次打开:软件商店-已安装-PHPx.x设置-配置文件

查找文本output_buffering,并在前面加上;注释

随后重载配置或重启PHP即可。

2.您的数据目录和文件可能可以从互联网访问。.htaccess 文件不工作。强烈建议您配置您的 web 服务器,使数据目录不再可访问,或将数据目录移到 web 服务器文档根目录之外。

这个其实是Nginx的问题,为了进一步提升安全性,我们打开Nginx网站设置:

在location内的禁止访问目录内,加入data目录以及cloud目录并重载Nginx配置。

image-20220208032949550

3.PHP 的安装似乎不正确,无法访问系统环境变量。getenv(“PATH”) 函数测试返回了一个空值

这个处理方法很简单;如果你是自己安装配置的PHP,一般不会出现这个问题,当时如果是使用宝塔安装,一般都会有这个问题,解决方法很简单:

在宝塔面板,依次打开:软件商店-已安装-PHPx.x设置-FPM配置文件

在文末添加:

env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/php/bin

image-20220208033849393

之后,可能需要重载PHP配置或者重启PHP服务才能生效。

4.您的网页服务器未正确设置以解析****。更多信息请参见文档

这个处理方法很简单,简单地说,设置Nginx即可。如果你的Nginx是宝塔安装的,那么打开网站的Nginx

之后追加以下内容:

rewrite /.well-known/carddav /remote.php/dav permanent;
rewrite /.well-known/caldav /remote.php/dav permanent;

image-20220208034204739

保存、重载配置即可。

5.MySQL 被用作数据库,但不支持 4 字节字符。要能够在文件名或评论中正确处理 4 字节字符 (如 emoji),建议在 MySQL 中启用 4 字节支持。

1.在 [mysqld] 配置段里加入

innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table=1

image-20220208040342371

2.修改nextcloud的数据库的字符集和排序规则

ALTER DATABASE nextcloud所在的数据库名称 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

使用phpmyadmin

image-20220208040733235

执行成功:

image-20220208040658706

3.重启MySQL,修改nextcloud配置文件/config/config.php

// 支持 4 字节字符(如 emoji)
'mysql.utf8mb4' => true,

image-20220208041407901

4.修复数据库

occ命令,需要在nextcloud的安装根目录下执行:

sudo -u www php occ maintenance:repair 

重启nginxphp

6.未找到 PHP 的 "fileinfo" 模块。强烈推荐启用该模块,从而获得更好的 MIME 类型探测结果

image-20220208042346603

安装如下插件:

image-20220208042803627

删除“获取自己的免费账号”

使用 Nextcloud 分享文件时,页面底部默认会有一排“获取自己的免费账号”的文字链接,点击就会跳转到 Nextcloud 官网 Simple sign up 页面,如果不需要这个选项,可以在配置文件中添加相关参数去掉这一排文字链接。

image-20220208050310287

/nextcloud/config/config.php 文件中添加以下代码后保存后即可

// 隐藏“获取自己的免费账号”
'simpleSignUpLink.shown' => false,

  如果需要修改这一排文字链接,可以尝试先修改以下两个文件中对应的文字为需要的内容

  文件一:/nextcloud/core/l10n/zh_CN.json 第 311 行,将这行中的“获取自己的免费账号”替换为自己的需要的文字

"Get your own free account" : "获取自己的免费账号",

  文件二:/nextcloud/core/templates/layout.public.php 第 99 行,将这行中的 "https://nextcloud.com/signup/" 替换为自己需要的链接

<a href="https://nextcloud.com/signup/" target="_blank" rel="noreferrer noopener">

  如果需要更换使用其他语言时显示的文字链接,方法也和上面一样。

参考资料:

https://caniuse.com/contentsecuritypolicy

https://blog.csdn.net/weixin_33883178/article/details/92269124

https://github.com/joeyguo/blog/issues/5

http://www.ruanyifeng.com/blog/2016/09/csp.html

https://github.com/nextcloud/server/issues/9297

https://docs.nextcloud.com/server/13/developer_manual/app/controllers.html#modifying-the-content-security-policy

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

https://segmentfault.com/a/1190000000369549

https://wxx.olzl.net/21b03n45

https://cloud.tencent.com/developer/article/1787467

https://bugxia.com/1131.html

http://amh.sh/bbs/post-10849-1-2.htm

https://zhujitips.com/1978

https://www.cnswiz.com/3505.html

最后修改:2022 年 02 月 08 日 05 : 08 AM

发表评论