Wordpress是一款强大的开源网站CMS系统,其不仅仅能用于搭建博客,还可以搭建门户网站,论坛等多种网站形式。理论上Wordpress可以做到搭建出任何网站。但伴随而来的则是众多的安全漏洞,Wordpress的一些功能被黑客所滥用,最后将Wordpress站点变为自己的肉鸡之一。如果你的Wordpress站点使用的是Apache,那么你可以使用.htaccess文件来解决一些Wordpress中存在的安全性问题。
首先,我们需要了解一下什么是.htaccess
.htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
如果你的站点使用的是Apache服务器,那么作为管理员或者站长的你就必须要会有效的配置.htaccess文件,除了可以解决网站安全问题之外,正确有效的配置.htaccess还可以实现各种各样丰富多彩的功能,例如自定义错误页面,网站重定向等,可谓是功能丰富。
Wordpress默认的.htaccess代码
如果你确定你的网站使用的是Apache服务器,但是你却没有在你的网站目录中发现.htaccess文件,那么你可以自己创建一个。绝大多数的Apache服务器都是支持自定义.htaccess文件的。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
请注意:不要编辑任何# BEGIN WordPress和# END WordPress之间的代码。如果需要添加自己的代码,请在下面添加。
如果你的 Wordpress 是多站点模式,那么.htaccess代码是不一样的,更多请参阅 Wordpress Codex
拒绝访问所有.htaccess文件
下面的代码可以实现拒绝访问 WordPress 站点中的所有 .htaccess 文件。这样别人便无法查看你的Web服务器配置,从而防止被探明网站目录等隐私问题。
# Denies access to all .htaccess files
<Files ~ "^.*\.([Hh][Tt][Aa])">
Order Allow,Deny
Deny from all
Satisfy all
</Files>
保护wp-config.php文件
wp-config.php文件中含有所有 Wordpress 的配置,其中包含你的数据库登陆名和密码,是一个非常危险的漏洞。我们建议你应该拒绝所有人访问他,但你也可以允许特定的IP地址访问他。
如果您希望允许特定的IP地址访问,那么只需去除# Allow from xx.xx.xx.xxx 前面的 # ,并插入管理员的IP地址来代替xx.xx.xx.xxx。
# Protects wp-config
<Files wp-config.php>
Order Allow,Deny
# Allow from xx.xx.xx.xxx
# Allow from yy.yy.yy.yyy
Deny from all
</Files>
防止XML-RPC DDoS攻击
WordPress 站点中默认支持XML-RPC,这是一个远程发布api。虽然它是一个很棒的功能,但它也是WordPress最大的安全漏洞之一,因为黑客很可能利用它来进行DDoS攻击。
如果您不想使用此功能,最好禁用它。和以前一样,你可以通过去除# Allow from xx.xx.xx.xxx前面的 # 和添加管理员(或多个)的IP地址。
# Protects XML-RPC, prevents DDoS attack
<FilesMatch "^(xmlrpc\.php)">
Order Deny,Allow
# Allow from xx.xx.xx.xxx
# Allow from yy.yy.yy.yyy
Deny from all
</FilesMatch>
阻止获取目录文件索引列表
大多数WordPress网站默认情况下不会禁止直接访问目录列表,这意味着任何人都可以浏览您服务器中的文件夹和文件,包括媒体上传文件夹和插件文件夹。不用说,这肯定是一个巨大的安全漏洞。幸运的是,您只需要一行代码就可以修复这个漏洞了。此代码段将向想要访问您的目录的任何人返回403错误。
# Prevents directory listing
Options -Indexes
防止用户名穷举
如果你的 Wordpress 站点启用了永久链接功能,那么攻击者可以非常容易的穷举你网站管理员的用户名,从而带来安全隐患。幸运的是,和上面一样,只需要一行代码便可解决这个问题。
# Prevents username enumeration
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]
防止图片盗链
虽然这并不是一个安全问题,但是别人很可能会滥用你WP网站中的这个功能,例如把你的网站当成图床使用。会大大的增加你服务器无效的带宽浪费。如果你不希望别人盗用你的链接,那么请务必加上下面这行代码。
# Prevents image hotlinking
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite2.com [NC]
RewriteRule \.(jpe?g?|png|gif|ico|pdf|flv|swf|gz)$ - [NC,F,L]
注意:上述代码中的“yourwebsite.com”请务必修改为你自己网站的域名,例如:RewriteCond %{HTTP_REFERER} !^https://www.gbsat.org [NC]
限制对插件和主题PHP文件的直接访问
如果有人直接调用您的插件和主题文件,无论是意外发生还是黑客等攻击者,都会很危险。此代码段来自Acunetix。您可以在他们的博文中阅读有关此漏洞的更多信息。
# Restricts access to PHP files from plugin and theme directories
RewriteCond %{REQUEST_URI} !^/wp-content/plugins/file/to/exclude\.php
RewriteCond %{REQUEST_URI} !^/wp-content/plugins/directory/to/exclude/
RewriteRule wp-content/plugins/(.*\.php)$ - [R=404,L]
RewriteCond %{REQUEST_URI} !^/wp-content/themes/file/to/exclude\.php
RewriteCond %{REQUEST_URI} !^/wp-content/themes/directory/to/exclude/
RewriteRule wp-content/themes/(.*\.php)$ - [R=404,L]
设置永久重定向 (301)
你可以使用.htaccess 命令做出永久重定向。首先,你必须添加旧URL,然后按照指向要将用户重定向到的页面的新URL。
# Permanent redirects
Redirect 301 /oldurl1/ http://yoursite.com/newurl1
Redirect 301 /oldurl2/ http://yoursite.com/newurl2
注意:请把oldurl改为你希望定义的旧URL,把newurl改为你希望定义的新URL。
限制对 wp-includes 目录的所有访问
/wp-includes/文件夹包含必需的核心WordPress文件。没有内容、插件、主题或用户可能想要访问的任何其他内容。因此,为了加强安全性,最好禁止对它的所有访问。
# Blocks all wp-includes folders and files
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
阻止跨站点脚本(XSS)
以下代码片段来自WP Mix,它可以保护你的站点免受一些常见的XSS攻击,即脚本注入和尝试修改全局和请求变量。
# Blocks some XSS attacks
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F,L]
</IfModule>
启用浏览器缓存
正如我之前提到的,.htaccess不仅有利于安全性和重定向,还可以帮助您管理缓存。下面的代码片段来自Elegant Themes,它通过允许访问者保存某些类型的文件使浏览器缓存成为可能,因此下次访问时他们不必再次下载它们。
# Enables browser caching
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>
设置自定义错误页面
你可以使用 .htaccess 文件来定义自定义的错误提示页面。首先你需要自己创建一个错误页面文件,例如 error404.html ,接下来上传到你网站的目录中,定位其目录,不要忘记在下列代码中修改你的目录。
你可以为所需的任何HTTP错误状态代码(4XX和5XX状态代码)设置自定义错误页面。
# Sets up custom error pages
ErrorDocument 403 /error403.html
ErrorDocument 404 /error404.html
上述便是一些实用的 .htaccess 代码了,如果有什么更好的 .htaccess 代码,欢迎在下方评论区中提出来。希望所有人的Wordpress站点都可以免受漏洞和攻击。
备注:本文部分内容参考自 https://www.hongkiat.com/blog/useful-htaccess-snippets-for-wordpress/
文章评论