一.前言

目前有很多Wordpress站点使用Timthumb处理外链略缩图,不过这玩意性能和安全上都存在一些问题。

通过Nginx 缓存Timthumb和重写其URL让其静态化,至于恶意请求抓取任意图片的安全问题通过URL加密解决。

二.部署

1.Nginx规则

重写规则

rewrite ^/thumb/w(\d*)_h(\d*)/([a-zA-Z0-9]*(|=|==))v3\.(jpg|JPG|jpeg|JPEG|bmp|BMP|gif|GIF|png|PNG)$ /timthumb.php?src=$3&w=$1&h=$2&zc=1&q=85&ct=1 last;

上面代码是将

/timthumb.php?src=外链地址&w=参数&h=参数&zc=参数&q=参数&ct=参数

重写为

/thumb/w宽度_h高度/图片地址加密地址.jpg

([a-zA-Z0-9]*(|=|==))用来匹配base64。重复模式不知道怎么 nginx 报错,大佬求解。
base64匹配正则 [a-zA-Z0-9/+]*={0,2}

缓存规则

将下列规则添加到Nginx配置的Http内。

fastcgi_cache_path /tmp/pic_cache levels=1:2 keys_zone=pic_cache:20m inactive=30d max_size=1G;
fastcgi_temp_path /tmp/temp;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

将下列规则添加到Nginx网站配置的php规则内

#新增的缓存规则
astcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache "$upstream_cache_status From fastcgi";
fastcgi_cache pic_cache;
fastcgi_cache_valid 200 30d;
fastcgi_cache_valid 301 302 404 1h;

2.修改php代码

改你wordpress内调用Timethumb的代码进行加密。

例如

$result = $host.'/timthumb.php?src='.$imgurl.'&w='.$width.'&h='.$height.'&zc='.$zc.'&q='.$q.'&ct=1';

修改为

$result = $host.'/thumb/w'.$width.'_h'.$height.'/'.base64_encode($imgurl).'v3.jpg';

虽然使用Base64混淆了外链地址,但是这样还是不能够阻止有人恶意请求文件。

你可以将长宽等信息也一起用对称加密解决这个问题。

然后修改Timethumb代码进行解密即可。

修改

$this->src = $this->param('src');

$this->src = base64_decode($this->param('src'));

 

修改完成后重启Nginx查看效果。

访问

/thumb/w330_h200/aHR0cDovL3d3MS5zaW5haW1nLmNuL2xhcmdlLzAwNVFLQlJwancxZmJpaGdxejZnemozMWhjMHUwMTc3LmpwZw==v3.jpg

应该能正常显示图片了。

本文标签 : # #