在开始之前我先诠释一下安全防护的大概逻辑分层,它的分层基本都是按照事前,事中,事后这三个层面来进行安全防护。
所以本次分层次进行解释WordPress安全防护指南的整体防护策略,先解释事前需要解决的安全问题,所以标题就是防护网站的文件和数据库。
这里说的事前,事中,事后,是基于一个标准,这个标准是WordPress安装前安全需要做什么?安装完成之后在运行的过程中安全需要做什么?安装完成之后在运行的过程中被恶意攻击了事后恢复解决该问题的安全措施该如何做?
基于上面的问题,我们就先从事前的安全防护措施来,具体可参考如下目录结构:
安装WordPress之前的准备
这里说的安装WordPress之前是你已经使用VPS搭建好Web服务了,然后在WordPress官方下载好了最新版本的WordPress安装包,然后上传并解压到Web服务目录中,找到文件wp-config.php文件,对这个文件进行修改,下面的操作都是在这个文件里面进行修改。
非VPS环境直接找到wp-config.php文件进行修改,一般情况下可以不操作,因为服务商一般都会给你预先做好这类的安全配置。
更改数据库前缀
默认情况下安装WordPress,对应的数据库前缀是wp_ ,为了防止恶意攻击者能猜出数据库名称,所以要进行更改以便增加攻击的难度。
更改的方式如下:
$table_prefix = ‘wp_’;
更改为
$table_prefix = ‘inl_wp_’;

更改身份验证密钥
这步操作的目的是为了强制剔除已经登录成功的会话,记住一句话,安全是持续不断的进行,需要周期性定期的维护,所以最佳安全实践是要求定期更改身份验证密钥。
修改身份验证密钥可以自己自定义生成并修改,但是我还是推荐WordPress官方给定好的脚本直接生成,然后只需要替换即可,官方给定的脚本链接:https://api.wordpress.org/secret-key/1.1/salt
直接访问链接即可获取生成的身份验证密钥,可以刷新进行重新生成。

将上述得到的新密钥复制下来直接拷贝至wp-config.php文件中对应的位置即可,具体参考下图:

如果替换了上述的身份验证密钥,那么已经登录成功的用户会被强制踢出。
wp-config.php原始文件样例。
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the web site, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * Localized language
* * ABSPATH
*
* @link https://wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'dbiolkxxxxx' );
/** Database username */
define( 'DB_USER', 'ulqpdsdvxxxxx' );
/** Database password */
define( 'DB_PASSWORD', '7c8fsghxxxxx' );
/** Database hostname */
define( 'DB_HOST', '127.0.0.1' );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', 'G]3an,<I}ldxxxi3r[JGP8?Le@(~:/~n2<&L47<JRyzL_oi|<eNIs`vx7)P@u]OIv' );
define( 'SECURE_AUTH_KEY', 'c68.3L A&]-xxx2/NfW-Zy:S;!Ft[BnJ0q|,3{.*TH>2=nR+Mq3f+doR8qWg<Mj}' );
define( 'LOGGED_IN_KEY', 'g,MMeRHE>(>v22+ ON,UwKtd%lNOo~.c]CA.PKHYQ6l[:YxJES5CMQGG`xxx9[Qh' );
define( 'NONCE_KEY', 'bS%cBi/XH>xxx}OG,8 yMq4^oFA}o`E2VV|$[r+oAo>$e){I&].,pT5vxp_,=s9v' );
define( 'AUTH_SALT', ',*|3BhAs|8~Rxxxx:N-`lYt|.HAJa`<90*sz^no3R2>H,[TlWzcZLOiTyh{>19<!' );
define( 'SECURE_AUTH_SALT', 'DRydHuVXVO@_xxxF.Zp3pI?/5N| 1X(cVr7}ltDO2I7xMmQYo,`+1YAnu,}zcqui' );
define( 'LOGGED_IN_SALT', ',&S_!hq@}X>`LG?Y;*S-XR18F!987Gp^tNd{#MWX=S;2uStGEk!q_fd{;Q3xxxx1' );
define( 'NONCE_SALT', '4DCQWtWO_6yxxxx]4hE?7)ijWaN|i(ZstrA|;#<P8bn]cGV:$XP.G_eV0=5W+mi8' );
define( 'WP_CACHE_KEY_SALT', '}mKtPylp@ml7xxxxyXhDoB$v]U=/|bC:=iR)- Q5d^m;`J%?ERMiv:BZCFm(D!Xd' );
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = 'inl_';
/* Add any custom values between this line and the "stop editing" line. */
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
if ( ! defined( 'WP_DEBUG' ) ) {
define( 'WP_DEBUG', false );
}
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
@include_once('/var/lib/sec/wp-settings-pre.php'); // Added by SiteGround WordPress management system
require_once ABSPATH . 'wp-settings.php';
@include_once('/var/lib/sec/wp-settings.php'); // Added by SiteGround WordPress management system
安装WordPress之后的操作
使用.htaccess文件禁止访问敏感文件
默认情况下通过网站根目录下的.htaccess文件实现的代码如下:
验证测试.htaccess规则的在线网站:
#Deny Directory Listing
Options - Indexes
#Block sensitive files
<Files .htaccess>
Order deny,allow
allow from 10.10.9.232
Deny from all
</files>
<Files wp-config.php>
Order deny,allow
allow from 10.10.9.232
Deny from all
</files>
在上述操作之前记得先备份.htaccess文件,且你充分了解.htaccess语法,否则不要操作
为了更安全,还可以在/wp-admin目录下创建一个.htaccess文件,目的是禁止访问该目录下的敏感文件,具体实现代码:
#Block installation files<Files install.php>
<Files install.php>
Order deny,allow
allow from 10.10.9.232
Deny from all
</Files>
<Files setup-config.php>
Order deny,allow
allow from 10.10.9.232
Deny from all
</Files>
在上述操作之前记得先备份.htaccess文件,且你充分了解.htaccess语法,否则不要操作
检查网站根目录下的robots.txt文件
通过检查网站根目录下的robots.txt文件来防止敏感信息泄露,例如:wp-admin,如果泄露这个文件名称,那么作为攻击者就知道了网站的后台目录地址,所以一般这种情况下最好是确保在robots.txt文件中不存在敏感信息。
禁用pingbacks和trackbacks通知
在下图位置,取消勾选即可。

这么做的目的是为了防止有可能发生的DDoS攻击的情景。
避免使用通用的用户名
在安装WordPress过程中,避免使用通用的用户名,例如:admin,root等通用的用户名,目的是为了防止攻击者使用这些通用的用户名对网站登录窗口进行暴力破解尝试,所以这一步在安装完成之后进行检查即可,若发现有这类通用的用户名更改不常用的即可,且设置账户的密码要8-20位至少包含3种可能的密码复杂度要求。
更改文件和目录的权限
操作网站根目录文件和文件夹权限
- 更改文件和目录的权限的根本原因如下:
- 他日网站被攻击,攻击者通过漏洞可以将漏洞利用代码打入网站中,但是在执行使用的时候显示没有权限执行。
- 攻击者外部看上去认为漏洞利用代码落在了目标网站的磁盘对应网站目录中,但实际因为权限不足并没有成功,而且给攻击者回显是显示成功的场景。
- 攻击者成功打入webshell到网站中,并能正常访问网站,但是权限很小,无法提权。
- 要做的防御操作其实很简单,就是遵循权限最小化的原则。
- 更改文件和目录权限的方式有两种:
- 直接ssh后台进入网站根目录根据实际业务提供的服务配置当前拥有人的权限即可。
- 根据网站的托管商提供的更改权限功能进行操作。
- Tip:一般如果不清楚的话,(操作之前备份)就将文件夹权限改成755,文件权限改成644,然后拥有人一定要是网站启动进程的用户名,比如启动网站的用户名是apache,那么拥有人权限就是apache。
在目录中禁用PHP
阻止对特定目录中PHP脚本的执行
- 在Apache服务器上,使用.htaccess文件, 阻止对特定目录中PHP脚本的执行,具体操作如下:
- 在WordPress网站根目录下,找到下面3个目录:
/wp-content/uploads
/wp-content/plugins
/wp-content/themes
- 创建新的文件 .htaccess
- 然后将下面的内容添加进去
<Files *.php>
deny from all
</Files>
在WordPress中禁用编辑文件功能
WordPress后台编辑文件主题和插件
- 在配置文件wp-config.php中添加如下代码:
define( 'DISALLOW_FILE_EDIT', true );
- 可禁用编辑主题,插件和文件。
- 添加下面代码可禁止用户安装主题和插件
define( 'DISALLOW_FILE_MODS', true );
- 若要恢复上述操作就将上面代码为true改为false
使用CDN来隐藏服务端真实地址
- CDN的两个主要作用。
- 可以隐藏真实IP地址。
- 可以防御DoS或者DDoS攻击。
- Tip:Siteground的CDN免费版本使用只对主站做了CDN,但是对于子域名,例如:ssh.xx.com, ftp.xx.com都没有做CDN,所以会泄露真实IP地址,不能隐藏网站真实IP地址,至于付费的没试过,咱不清楚。
备份网站
- 一般除了服务提供商提供的备份功能之外,自己会手动全量备份网站,这样做的好处如下:
- 网站有任何日常使用或影响提供正常服务的问题都可以通过备份来解决。
- 网站被恶意攻击,可以通过备份直接解决问题。
- 备份思想战略
- 保留 3 份备份。
- 至少以两种不同的格式备份。
- 其中一个备份应位于不同的物理位置。