一个恶作剧玩法
作者:郑凯
其实是以前看到一个想法:http://www.ruanyifeng.com/blog/2008/11/finding_great_developers.html
他们不在车库里组建乐队,而是动手完成一个很酷的黑客程序,对付那些企图偷用别人 Wi-Fi 带宽的邻居,当那些人一打开 Web 网页,所有里面的图片都会倒过来。哇哈哈哈哈!
后来想到,虽然不怎么用 Wi-Fi(更主要的是,也不了解运作),但做这么个代理服务器也不错,如果是恶搞同事之类的,给浏览器改个代理也很方便。搜了一下,Squid 可以提供接口,就用 Apache 和 PHP 配合着做了个。
原理是这样:Squid 把所有的 URL 交给 PHP,由 PHP 做判断,如果是图片后缀,则下载、用 ImageMagicK 把图片颠倒后放到某 Web 目录,并返回颠倒后的图片 URL
当然实际效果受 CSS Sprites 和 Flash 的影响,并不怎么好。
在我这个例子里,所有图片存到 /revimg 目录,转换后的图片存到 /revimg/out,并用 Apache 配个 vhost 访问这个目录
vhost 配置
<VirtualHost *:80>
ServerName revimg.soulogic.com
DocumentRoot /revimg/out
</VirtualHost>
PHP 脚本,存到 /etc/squid/redirect.php 并 chmod +x。注意由于我这个 blog 高亮有问题所以少了第一行 #!/usr/bin/php
chdir("/revimg");
$sServer = "revimg.soulogic.com";
while ($sContent = fgets(STDIN) ) {
$sContent = trim($sContent);
if (empty($sContent)) {
continue;
}
$aArg = explode(" ", $sContent, 5);
$sURL = $aArg[0];
if ($aArg[3] != "GET") {
fwrite(STDOUT, $sURL."\n");
continue;
}
$aURL = parse_url($sURL);
$aURL += array("scheme" => "", "host" => "", "path" => "");
if ($aURL["scheme"] != "http"
|| $aURL["host"] == $sServer
|| !preg_match("/^[0-9a-z\\-]+(\\.[0-9a-z\\-]+)+(:[0-9]{2,5})?$/i", $aURL["host"])
|| !preg_match("/\\.(jpg|jpeg|png|gif)$/i", $aURL["path"])
) {
fwrite(STDOUT, $sURL."\n");
continue;
}
// 检测通过,处理图片
$sHash = md5($sURL);
$sDir = substr($sHash, 0, 2)."/".substr($sHash, 2, 2);
$sFile = $sDir."/".substr($sHash, 4);
$sFileOut = "out/".$sFile;
if (!file_exists($sDir)) {
mkdir($sDir, 0777, TRUE);
mkdir("out/".$sDir, 0777, TRUE);
chmod("out", 0777);
chmod("out/".substr($sHash, 0, 2), 0777);
chmod("out/".$sDir, 0777);
}
if (!file_exists($sFile)) {
$sCmd = "wget -qc ".escapeshellarg($sURL)." -O ".$sFile;
exec($sCmd);
}
if (!file_exists($sFileOut)) {
$sCmd = "convert ".$sFile." -flip -quality 80 ".$sFileOut;
exec($sCmd);
chmod($sFileOut, 0666);
}
$sURL = "http://".$sServer."/".$sFile;
fwrite(STDOUT, $sURL."\n");
}
Squid 的配置文件里加一行
url_rewrite_program /etc/squid/redirect.php
如果是老版的 Squid 可能叫 redirect_program
这类脚本还可以做很多加工,由于使用的是标准输入输出,跟 Web 不太一样,如果是调试的话,可以把测试文本放到文件里, 用 cat test.txt | ./redirect.php
的方式。
很多图片会由于 header Expires 而缓存住,如果是恶搞别人的话最好顺便清下浏览器的缓存文件。
我能想到的比较能看出效果的网站有 PCPOP、蜂鸟、京东之类的