转载

为什么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 里面有一个选项能部分的解决这个问题:

为什么WordPress面对404攻击会如此脆弱

就是“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 里的 themesuploads 目录下的很多静态文件也避免了干扰Wordpress运行。

WordPress的强大之处就在于它的资源请求有一个统一入口(index.php),可以全局掌控,灵活配置。但成也萧何败也萧何,对404攻击的脆弱性也是由此引起的。对于这个问题的弥补方法有很多种,其中上面介绍的两个方法只是最简单的方法,只能解决部分的原因,还有其它一些方法,比如静态化,功效会更大,但实现起来更复杂。如果你对这个问题有一些更好的注意和想法,欢迎分享出来!

正文到此结束
Loading...