一个恶作剧玩法


作者:郑凯

其实是以前看到一个想法: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、蜂鸟、京东之类的