php源码显ip图片显IP图片签名分析

创建画布
1.创建画布函数$img = imagecreatefrompng(‘bg.png’);,在这里是直接用一个背景图片来创建画布。

2.设置颜色$blue = imagecolorallocate($img,0,0,200);

3.输出文字信息imagettftext($img, 12, 0, 30, 100, $blue, “simkai.ttf”, “牛牛逼逼叉叉 http://www.nnbbxx.net”);在这里第一个参数是图像句柄,第二个参数是字号,第三个参数是角度,第四个参数文字起始点的x坐标值,第五个参数是文字起始点的y坐标值,第六个参数是颜色,第七个参数是字体,第八个参数是需要输出的文字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//创建画布
$img = imagecreatefrompng('bg.png');
//设置颜色
$blue = imagecolorallocate($img,0,0,200);
$red = imagecolorallocate($img,255,0,0);
$black = imagecolorallocate($img,0,0,0);
//输出文字
imagettftext($img, 12, 0, 10, 20, $red, "simkai.ttf", "IP:".$ip." 来自:".$adress);
imagettftext($img, 12, 0, 10, 40, $red, "simkai.ttf", "你的操作系统为:".$system);
imagettftext($img, 12, 0, 10, 60, $red, "simkai.ttf", "你的浏览器为:".$exp[0].$exp[1]);
imagettftext($img, 12, 0, 10, 80, $red, "simkai.ttf", "今天是:".$date);
imagettftext($img, 12, 0, 30, 100, $blue, "simkai.ttf", "牛牛逼逼叉叉 http://www.nnbbxx.net");
//输出图像
header("Content-type:image/png");
imagepng($img);
//销毁图像
imagedestroy($img);
?>

获取用户的系统信息
需要用到的知识点有以下几个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$_SERVER[‘HTTP_USER_AGENT’]
stripos()
function getSystem(){
$sys = $_SERVER['HTTP_USER_AGENT'];
if(stripos($sys, "NT 6.1"))
$os = "Windows 7";
elseif(stripos($sys, "NT 6.0"))
$os = "Windows Vista";
elseif(stripos($sys, "NT 5.1"))
$os = "Windows XP";
elseif(stripos($sys, "NT 5.2"))
$os = "Windows Server 2003";
elseif(stripos($sys, "NT 5"))
$os = "Windows 2000";
elseif(stripos($sys, "NT 4.9"))
$os = "Windows ME";
elseif(stripos($sys, "NT 4"))
$os = "Windows NT 4.0";
elseif(stripos($sys, "98"))
$os = "Windows 98";
elseif(stripos($sys, "95"))
$os = "Windows 95";
elseif(stripos($sys, "Mac"))
$os = "Mac";
elseif(stripos($sys, "Linux"))
$os = "Linux";
elseif(stripos($sys, "Unix"))
$os = "Unix";
elseif(stripos($sys, "FreeBSD"))
$os = "FreeBSD";
elseif(stripos($sys, "SunOS"))
$os = "SunOS";
elseif(stripos($sys, "BeOS"))
$os = "BeOS";
elseif(stripos($sys, "OS/2"))
$os = "OS/2";
elseif(stripos($sys, "PC"))
$os = "Macintosh";
elseif(stripos($sys, "AIX"))
$os = "AIX";
else
$os = "未知操作系统";
return $os;
}
$system = getSystem();

检测用户的浏览器型号和版本
需要用到的知识点有以下几个:

1
$_SERVER[‘HTTP_USER_AGENT’]

用途:用来检查浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)等信息

1
stripos()

用途: stripos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。里面可以包含三个参数,第一个参数用于规定被搜索的字符串,第二个参数用于规定要查找的字符,第三个参数用于规定开始搜索的位置。其中前两个参数必需,第三个可选。

正则表达式,在此不说太多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//分析返回用户网页浏览器名称,返回的数组第一个为浏览器名称,第二个是版本号。
function getBrowser() {
$sys = $_SERVER['HTTP_USER_AGENT']; //获取用户代理字符串
if (stripos($sys, "Firefox/") > 0) {
preg_match("/Firefox/([^;)]+)+/i", $sys, $b);
$exp[0] = "火狐浏览器";
$exp[1] = $b[1]; //获取火狐浏览器的版本号
} elseif (stripos($sys, "Maxthon") > 0) {
preg_match("/Maxthon/([d.]+)/", $sys, $aoyou);
$exp[0] = "傲游浏览器";
$exp[1] = $aoyou[1];
} elseif (stripos($sys, "MSIE") > 0) {
preg_match("/MSIEs+([^;)]+)+/i", $sys, $ie);
//$exp = "Internet Explorer ".$ie[1];
$exp[0] = "IE浏览器";
$exp[1] = $ie[1]; //获取IE的版本号
} elseif (stripos($sys, "OPR") > 0) {
preg_match("/OPR/([d.]+)/", $sys, $opera);
$exp[0] = "Opera浏览器";
$exp[1] = $opera[1]; //获取opera浏览器版本号,今天下载一个opera浏览器做测试,发现opera竟然也换成谷歌的内核了,囧
}elseif (stripos($sys, "Chrome") > 0 && stripos($sys, "SE") > 0) {
$exp[0] = "搜狗浏览器";
$exp[1] = "";
}elseif (stripos($sys, "Chrome") > 0) {
preg_match("/Chrome/([d.]+)/", $sys, $google);
$exp[0] = "Chrome浏览器";
$exp[1] = $google[1]; //获取google chrome的版本号
}else {
$exp = "未知浏览器";
$exp[1] = ""; //其余的浏览器大家可以根据输出的$_SERVER['HTTP_USER_AGENT']信息来自行获取浏览器名称和版本号
}
return $exp;
}
$exp=getBrowser();
$browser=$exp[0]

获取用户的IP及所在地信息
1.几个获取IP的变量

1
2
3
$_SERVER[‘REMOTE_ADDR’];//访问端(有可能是用户,有可能是代理的)IP
$_SERVER[‘HTTP_CLIENT_IP’];//代理端的(有可能存在,可伪造)
$_SERVER[‘HTTP_X_FORWARDED_FOR’];//用户是在哪个IP使用的代理(有可能存在,也可以伪造)

2.获取文件信息

fopen(文件名,读写);这个函数的第一个参数文件名可以是一个网址,这样就相当于打开一个网页,此时第二个参数可以设置为“读”即可,因为不需要进行写的操作;
file_get_contents($url);这个函数传入一个网址可以获取整个网页的内容;
preg_match_all(正则表达式,匹配内容,数组);这个函数大家应该很熟悉,通过正则表达式匹配第二个参数中的内容,然后得到的结果返回到第三个参数设置的数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//获取用户IP地址
function getIP(){
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) {
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) {
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]) {
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}elseif (getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
}elseif (getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
}elseif (getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");
} else {
$ip = "Unknown";
}
return $ip;
}
$ip=getIP();

//获取地区信息
function getAdress($a){
$url = "http://ip.chinaz.com/?IP=".$a;
$fp = @fopen($url, "r") or die("超时");
$fcontents = file_get_contents($url);
preg_match_all("/==>> d+ ==>> (.*)</strong><br />
/", $fcontents, $regs);
return $regs[1][0];
}
$adress = getAdress($ip);

看完之后最终的演示地址请返回开头部分有看到。

游览器的agent返回前几段也可以看到。