[原创]PHP图片防盗链

貌似这个东西实用性不是不大,就是写着好玩吧。
介绍:脚本可以隐藏图片的真实地址,起到防盗链的作用(似乎对IE兼容不佳,以后有空再慢慢弄吧),脚本能根据GET变量调用不同的图片。而且脚本使用了Nginx的X-sendfile特性大大提升了使用效率。
P.S:脚本写的很渣,大家看看就行了。

<?php
include 'function.php';
session_start();

//获取GET数据
$n = $_GET["n"];
$f = $_GET["f"];
$h = $_GET["h"];
$aid = $_GET["aid"];

//如果AID为空对浏览器进行跳转,获取AID
if($aid == "") {
	$_SESSION["AID"] = md5($_SERVER["REMOTE_ADDR"].$_SERVER["REMOTE_PORT"]);
	$aid = $_SESSION["AID"];
	header("Location: ./pic.php?n=$n&f=$f&h=$h&aid=$aid");
	exit;
}

//对比获取到的AID和SESSION中的数据
//获取文件后缀类型,并设置header
if($_SESSION["AID"] != $aid){
	header("content-type:image/png");
	MsgImg("对不起,此图片链接已经失效!");
	exit;
}else {
	$hz=Check($h,1,1,1);
	switch($hz) {
		case 1:
			$hz = jpg;
			header("content-type:image/jpeg");
			break;
		case 2:
			$hz = jpge;
			header("content-type:image/jpeg");
			break;
		case 3:
			$hz = gif;
			header("content-type:image/gif");
			break;
		case 4:
			$hz = png;
			header("content-type:image/x-png");
		break;
		default:
			unset($hz);
	}
}

$name = Check($n,1,30,0).'.'.$hz;//源图片名
$floor = Check($f,2,5,0);//源目录

//判断是否有变量为空
if($hz == "" || $name == "" || $floor == "") {
	header("content-type:image/png");
	MsgImg("对不起,找不到该图片!");
	quit();
}


//判断文件时候存在,如存在则输出所选。不存在则输出文字信息。
if(file_exists("./upload/$floor/$name")) { //图片的实际路径
	$filePath = "/download/$floor/$name";//完整路径使用Nginx的X-sendfile输出图片。
	header('X-Accel-Redirect: '.$filePath);
	//@readfile("./upload/$floor/$name");
	quit();
}else {
	header("content-type:image/png");
	MsgImg("对不起,找不到该图片!");
	quit();
}

function quit() {
	session_unset();
	session_destroy();
	exit();
}
?>

function.php文件

<?php
//检查输入数据
function Check($name,$min,$max,$suffix) {
	$Max_Strlen=$max;//最大长度
	$Min_Strlen=$min;//最短长度

	if($suffix == "1") {
		 $Chars="^[0-9]";//检查字符为纯数字
	} else {
	 	$Chars="^[A-Za-z0-9_-]";//检查字符
	}

	 $Output = "$name";//定义返回的字符串变量

	if(!mb_ereg("$Chars",$name))  { //正则表达式匹配检查
	 	$Output="";
		return $Output;
	}
	 
	if (strlen($name)<$Min_Strlen || strlen($name)>$Max_Strlen) {
	 	$Output="";
	 	return $Output;
	}

	return $Output;
}
	
function MsgImg($msg){
	// 创建图片
	$im = imagecreatetruecolor(400, 30);

	// 设置颜色
	$white = imagecolorallocate($im, 255, 255, 255);
	$grey = imagecolorallocate($im, 128, 128, 128);
	$black = imagecolorallocate($im, 0, 0, 0);
	imagefilledrectangle($im, 0, 0, 399, 29, $white);

	// 设置字体
	$font = 'wd.ttf';

	// 设置阴影
	imagettftext($im, 20, 0, 11, 21, $grey, $font, $msg);

	// 打印文字
	imagettftext($im, 20, 0, 10, 20, $black, $font, $msg);

	// 创建PNG文件
	imagepng($im);
	imagedestroy($im);
}
?>