使用PHP检测手机访问自动跳转WAP站的方法.

check_wap.php文件内容:

<?php
/**
*判断是否是通过手机访问
*/

function isMobile() {

	// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
	if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
		return true;
	}

	//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息

	if (isset ($_SERVER['HTTP_VIA'])) {
		//找不到为flase,否则为true
		return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
	}

	//判断手机发送的客户端标志,兼容性有待提高
	if (isset ($_SERVER['HTTP_USER_AGENT'])) {
		$clientkeywords = array (
		'nokia', 'sony', 'ericsson', 'mot',
		'samsung', 'htc', 'sgh', 'lg', 'sharp',
		'sie-', 'philips', 'panasonic', 'alcatel',
		'lenovo', 'iphone', 'ipod', 'blackberry',
		'meizu', 'android', 'netfront', 'symbian',
		'ucweb', 'windowsce', 'palm', 'operamini',
		'operamobi', 'openwave', 'nexusone', 'cldc',
		'midp', 'wap', 'mobile'
		);

		// 从HTTP_USER_AGENT中查找手机浏览器的关键字
		if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
			return true;
		}
	}

	//协议法,因为有可能不准确,放到最后判断
	if (isset ($_SERVER['HTTP_ACCEPT'])) {

		// 如果只支持wml并且不支持html那一定是移动设备
		// 如果支持wml和html但是wml在html之前则是移动设备
		if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
			return true;
		}
	}

	return false;
}

//跳转js

$js =
<<<EOT
var pgo=0;
function JumpUrl(){ if(pgo==0){ location='http://wap.jzbk.org'; pgo=1; } }
setTimeout('JumpUrl()',3000);
EOT;

//如果检测为wap访问,则跳转
if(isMobile()) {
	echo $js;
}

?>

在html页面引入

<script type="text/javascript" src="check_wap.php" ></script><!--wap跳转JS-->

 

[原创]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);
}
?>

 

为PHP增加纯真IP数据库(qqwry)支持

 当我们的网站需要根据IP来查询IP来源时,我们需要一个IP数据库,而国内最好的IP数据库当属“纯真IP数据库”了。为了读取“纯真IP数据库”中的数据,一般情况下我们需要写一段PHP程序,而目前Discuz!中就有这样的PHP代码,我们可以直接拿来使用。这样的做法对于一般网站来说已经够用了,但是对于计数器网站,有大量的IP查询事务,这时候使用纯PHP代码的方式就显得效率低下了。有没有更高效的方法呢?答案当然是肯定的。国内就有人写出了这样的PHP扩展,并且此扩展已经登录在PECL网站了。此扩展的名字叫做QQWRY,网站地址:http://http://pecl.php.net/package/qqwry/

qqwry的安装

 qqwry的安装方法与一般PHP扩展的安装方法一样:

wget http://pecl.php.net/get/qqwry-0.1.0.tgz
tar zxvf qqwry-0.1.0.tgz
cd qqwry-0.1.0
./configure --with-php-config=/usr/local/web/php/bin/php-config
make
make install

然后在php.ini中加入qqwry支持

extension = "qqwry.so"

 然后,重启php即可实现PHP的纯真IP数据库支持了。相比纯PHP代码的实现,此扩展的效率是其的6至10倍。

 qqwry的使用

 使用方法很简单,首先就是实例化,传入纯真数据库的文件路径,然后调用q方法。该方法返回一个数组,第一个值为所属区域,第二个值为更详细的地址。下面的iconv是把数据从GB2312转到UTF-8,如果你的站点是用GB2312,那么这一步是不需要的。

$qqwry=new qqwry('QQWry.Dat');

list($addr1,$addr2)=$qqwry->q('127.0.0.1');
$addr1=iconv('GB2312','UTF-8',$addr1);
$addr2=iconv('GB2312','UTF-8',$addr2);
echo $addr1,'|',$addr2,"\n";

$arr=$qqwry->q('222.216.47.4');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"\n";

$arr=$qqwry->q('64.233.187.99');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"\n";

输出如下:

本机地址|
广西南宁市|(青秀区)电信ADSL
美国|加利福尼亚州Google公司

PHP官网疑被国人入侵 源码疑遭篡改

php官方在其主页上发表了一个安全公告,表示曾经可能被成功入侵,但是经过排查源码并未被植入后门作为一款被广泛使用的开发语言,php源码的安全性令人堪忧,最近php官方就在一则公告里表明有人曾经成功侵入到php官方服务器内,并且成功渗透到php源码的修改权限,尽管经过排查表明入侵者并没有植入后门,但是已经表明了php源码存在风险的可能。最初的消息提交在wooyun安全信息报告平台上,提交者附上了原始的截图图片显示wiki.php.net被成功入侵攻击者测试成功修改了php的源码,并且有意思的他只是在phpinfo里留下了Wolegequ,Geliveable字样,似乎只是尝试是否能够对php源码成功修改,并且这些字样也表明应该是一个国内黑客所为。提交信息的昵称为BNE的人也并没有提到这些截图是如何获得的,也没有回应是否官方的公告是正确的。最原始的公告在http://www.wooyun.org/bugs/wooyun-2010-01635注:wooyun.org是一个安全信息报告平台,有很多安全爱好者在这里提交国内外主要厂商的安全问题,包括之前的微软的mhtml漏洞,IE8 css渲染问题,以及Google的一些安全问题都在这里被公开然后才被发布到国外的安全社区里。转自cnbeta