WordPress with SQLite

WordPress默认只支持MariaDB/MySQL数据库。本文讲述如何使用SQLite数据库来安装配置WordPress。

参考网址

WordPress 使用 SQLite 数据库 – fivestone
PHP/Sqlite下常见漏洞浅析 – 网站安全 – 红黑联盟 (2cto.com)

使用SQLite安装WordPress的优势

  • 对服务器要求低:SQLite是单文件数据库。
  • 备份、迁移方便:备份站点只需打包站点目录,迁移站点只需把站点目录打包上传到新的服务器上即可。不用导出、导入数据库。

使用SQLite安装WordPress的劣势

  • SQLite性能不及MariaDB/MySQL。适用于不需频繁访问数据库的简单网站。
  • 与使用Access作为站点数据库一样,使用SQLite也必须考虑防止SQLite文件被下载。

硬件环境

Lenovo ThinkPad T14 Gen2 20W1S3H811: Intel i5-1145G7 + DDR4 16GB + NVMe 512GB

虚拟机宿主环境

Win11 x64 Build 22621.2134 英文专业版 + VirtualBox v7.0.8 r156879

虚拟机客户机软件环境

Xubuntu 22.04最小安装,root账号已启用,APT已换国内源,apt update已完成,Screen 4.09.00 + Net-Tools + Openssh-Server 8.9p1已安装,openssh-server允许root远程登录,Nginx 1.18.0已安装,php-fpm 8.1.2已安装,Nginx与php-fpm已集成,WordPress 6.3已下载并解压到/var/www/wp.test.com,Nginx已发布wp.test.com站点。

Ubuntu安装php-sqlite3

apt install php-sqlite3

WP安装wp-sqlite-db插件

使用SQLite作为WP数据库,需要一个「Drop-in」插件来替换WP的数据库处理类。这个插件就是「wp-sqlite-db」。
wp-sqlite-db 的安装方法和普通插件不同,我们从https://github.com/aaemnnosttv/wp-sqlite-db下载src/db.php,然后复制db.php文件到wp-content目录就可以了。因为wp-sqlite-db是「Drop-in」类型插件,用来替换WP内置功能的,只要文件存在,插件就自动启用了。
修改db.php文件属主和属组chown www-data:www-data db.php

创建wp-config.php文件

WP还需要有wp-config.php才能工作,可将wp-config-sample.php改名得到。
mv wp-config{-sample,}.php
缺少这个步骤,WP还是按照默认MariaDB/MySQL数据库安装。

安装WordPress

在浏览器地址栏输入https://wp.test.com进入WP安装,要求用户输入MariaDB/MySQL数据库访问凭据的步骤会被跳过,其他步骤与使用MariaDB/MySQL安装WP相同。

(重要)SQLite文件防下载

用SQLite作为数据库安装WP,wp-content目录中会出现子目录database,里面的 .ht.sqlite文件就是WP的SQLite单文件数据库。只需访问 https://WP站点域名/wp-content/database/.ht.sqlite 即可下载 .ht.sqlite文件。

防止SQLite文件被下载的若干方法:

方法一(不安全):用#锚定符
将*.mdb或*.sqlite文件改名,开头加上#。浏览器访问https://WP站点域名/wp-content/database/#.ht.sqlite时,#会被浏览器视为页面上的锚定符,从而避免*.mdb或*.sqlite文件被下载。
但只要用Unicode编码,将地址中的#用%23代替,比如https://WP站点域名/wp-content/database/%23.ht.sqlite,还是可以下载*.mdb或*.sqlite文件。

方法二(不安全):随机文件名
数据库文件使用随机文件名,恶意下载者难以猜到。随机文件名设置长一些,对抗暴力猜测。
但短文件名漏洞的存在,此方法并不安全。

方法三(仅适用于SQLite):在SQLite数据库文件开头加入php代码
借鉴Access的数据库防护手法,将*.sqlite后缀修改为*.php,并创建表create table ‘<?php’ (a);。试图下载https://WP站点域名/wp-content/database/#.ht.sqlite.php时,会被当做php脚本运行而无法被下载。

方法四(仅适用于Apahce2服务器):配置Apache2阻止对*.sqlite文件的访问
如Apache2支持自定义.htaccess,可在.htaccess文件中加入以下内容:
<FilesMatch ".sqlite$">
Deny from all
<FilesMatch>

方法五:修改SQLite数据库文件保存路径
在wp-config.php里添加设置:
define('DB_DIR', '/absolute/custom/path/to/directory/for/sqlite/database/file/');
define('DB_FILE', 'custom_filename_for_sqlite_database');

可以更改数据库文件的存放位置。
把SQLite数据库文件放到无法直接用网址从外部访问的目录(记得给这个目录授权www-data账号可读写)。
这个方法安全性较高,但备份或迁移网站会麻烦些。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *