为什么WordPress面对404攻击会如此脆弱
不久前,本博客网站遭受了一次黑客攻击,当时服务器的现象是CPU使用率上升到100%,而带宽使用率因为CPU卡死而降为0。在解决了这个问题后,经过统计,发现恶意攻击的频率并不高,大多数都是404攻击,也就是向服务器请求不存在的页面资源。按按常理,Web服务器对404请求访问很容易应付的,消耗不了多少资源性能,但Wordpress网站为什么面对404攻击如此脆弱不堪呢?
要弄清楚这个问题,首先要明白Wordpress的工作原理。
# 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
上面这段配置来自网站的.htaccess文件,这是安装Wordpress系统时Wordpress自动添加的配置。从配置可以看出,所有的用户请求都会转向给index.php
文件处理,这个index.php
会做哪些事情呢?它会分析用户请求的url的结构模式/组成部分,判断是什么类型的请求(post,page,tag, catagory,archive等),分析出请求目标后,Wordpress会到缓存里找这些资源,如果找到了,就返回用户。如何缓存里没有找到,它就会到数据库里寻找,然后用PHP引擎生成相应的页面资源。
如果用户请求的是一个不存在的404资源呢?那么,Wordpress的执行过程一步都没有少:先找缓存,在找数据库,数据库还是没有,生成404页面。
在这里我们就会发现,对于所有的404请求,缓存里必然没有,Wordpress每一次都会到数据库里全库搜索。这是一个非常消耗数据库服务器和web服务器性能的操作。大量的404查询比如对服务器产生严重的影响。
使用Wordpress作为内容管理系统的站长都知道一种必须要有的插件,就是缓存插件。最著名的一个缓存插件是W3 Total Cache,在W3 Total Cache里面有一个选项能部分的解决这个问题:
就是“Browser Cache”里的“Do not process 404 errors for static objects with WordPress”选项。选中了这个选项后,你会发现.htaccess文件里多出了这样的配置:
# BEGIN W3TC Skip 404 error handling by WordPress for static files <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !(robots\.txt|[a-z0-9_\-]*sitemap[a-z0-9_\-]*\.(xml|xsl|html)(\.gz)?) RewriteCond %{REQUEST_FILENAME} \.(css|htc|less|js|js2|js3|js4|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|woff|xla|xls|xlsx|xlt|xlw|zip)$ [NC] RewriteRule .* - [L] </IfModule> # END W3TC Skip 404 error handling by WordPress for static files
可以看出,这段配置里列出了70多种常规的静态文件的后缀。也就是说,当Wordpress碰到了这种类型的资源请求时,如果硬盘上没有发现它们,就认定为404请求,不需要去缓存和数据库中寻找,从而避免了浪费服务器性能。
当然,W3 Total Cache的这种配置只能解决一部分问题。
还有一种方法是将Wordpress的wp-content
移到Wordpress外面,这样wp-content
里的themes
、uploads
目录下的很多静态文件也避免了干扰Wordpress运行。
WordPress的强大之处就在于它的资源请求有一个统一入口(index.php),可以全局掌控,灵活配置。但成也萧何败也萧何,对404攻击的脆弱性也是由此引起的。对于这个问题的弥补方法有很多种,其中上面介绍的两个方法只是最简单的方法,只能解决部分的原因,还有其它一些方法,比如静态化,功效会更大,但实现起来更复杂。如果你对这个问题有一些更好的注意和想法,欢迎分享出来!
我没安装w3 total cache,直接把那段.htaccess代码追加到.htaccess文件中就可以了吧?
理论上是应该可以的,可以小小的测试一下.
问下这段代码加在哪?直接替换掉.htaccess文件所有内容还是加在前面