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

 

又拍云简单测试

因为本人域名未备案,Blog一直在境外的服务器上,访问速度一直不是很理想。为了解决这一问题本人采用了口碑不错的又拍云,来存放CSS,JS和图片等静态文件来达到对Blog的加速。是用WebKaKa来检测又拍云在国内节点的Ping值。从上图中可以看出又拍云在国内的机器还是比较多的,而且各个地方的PING值也蛮不错。加速的效果比较明显。 下面我们来使用Just-Ping测试国外机器的Ping值。从上图可以看出又拍云对于国外线路的加速效果明显不是很好,PING值都偏大,估计是转于做国内的优化,对于国外的优化不是很到位。总结:要是网站主要的访客在国内的话还是比较推荐使用又拍云的。如果你的访客主要是外国人的话就不推荐使用又拍云了。

Linux下查找文件内容

 

Linux查找文件内容的常用命令方法:

 

1、从文件内容查找匹配指定字符串的行:

$ grep “被查找的字符串” 文件名

 

2、从文件内容查找与正则表达式匹配的行:

$ grep –e “正则表达式” 文件名

 

3、查找时不区分大小写:

$ grep –i “被查找的字符串” 文件名

 

4、查找匹配的行数:

$ grep -c “被查找的字符串” 文件名

 

5、从文件内容查找不匹配指定字符串的行:

$ grep –v “被查找的字符串” 文件名

 

6、从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行

find / -type f -name “*.log” | xargs grep “ERROR”

 

7、例子 :查找/SqLogs/access.log文件中包含”.exe” 或者”TCP_DENIED”的记录

方法1:grep /SqLogs/access.log –e “.exe”

grep /SqLogs/access.log –e “TCP_DENIED”

方法2:find /SqLogs –type f –name access.log | xargs grep “.exe”

find /SqLogs –type f –name access.log | xargs grep “TCP_DENIED”

 

ArchLinux包管理器pacman和yaourt简明用法

1.升级系统

pacman -Syu

2.升级系统,附带升级从aur安装的软件包

yaourt -Syu –aur

注:这条命令的确切意思是升级系统,从AUR升级本地软件数据库并安装更新。

3.安装包

pacman -S package_name
pacman -Sf package_name #重新安装软件包

4.只下载你要的包

pacman -Sw package_name

5.安装下载的包到指定目录

pacman -U /path/to/package/package_name-version.pkg.tar.gz

6.删除已安装的软件

pacman -R package_name
pacman -Rs package_name #卸载包的同时卸载相关依赖

注:-R和-Rs参数同样适用于yaourt。

7.查找包

pacman -Ss package
yaourt foo #会列出所有匹配foo的包,用户可选择安装。

8.查看本地包

pacman -Qi package #显示包信息
pacman -Ql package #显示包安装位置

9.清空cache

pacman -Scc

用pacman 安装的时候,下的包会在/var/cache 这个目录,你会发现这个文件夹很大

yaourt的其他用法:

yaourt -Si package_name #列出软件包信息
yaourt -Sc #从缓存中清楚旧的软件包
yaourt -Su #安装AUR中的更新软件包
yaourt -Sy #获取最新的AUR软件包数据库
yaourt -Cd #清除AUR软件包数据库

 

ArchLinux安装要点

1.安装文件包时记得设置DNS。

2.安装完成后首先设置Pacman镜像
nano /etc/pacman.d/mirrorlist
找到CN,去掉Server前面的#,Ctrl+X退出。

3.更新源列表,执行:

pacman -Syu

4.设置签名全部信任(如不设置会十分麻烦)
nano /etc/pacman.conf
在 Architecture = auto 下新增

SigLevel = Optional TrustAll

5.更新系统

pacman -Sy pacman
pacman -Su

6.安装yaourt(32位系统)
nano pacman.conf 最后添加:

[archlinuxfr]
Server = http://repo.archlinux.fr/i686

然后执行 pacman -Sy yaourt curl

ArchLinux上关闭IPv6的方法

IPv6日历历在目,为啥要关呢?我归纳为:洁癖,这和性能或内存啥的没关系。所谓的洁癖是指执行

netstat -lntp

类命令时,输出能清爽一点。

:::*

实在太丑了!

不管怎样,让我们来看看怎样在Arch linux有有效的关闭

IPv6

吧…

正确方法

其实Arch linux的wiki专门介绍过关闭IPv6: Disabling IPv6, 但尝试后发现method1和method2都不管用,必须重新生成一个

initramfs

。对于像我这样的菜鸟,还是列出命令更实惠:

首先编辑

/etc/modprobe.d/modprobe.conf

,添加:

options ipv6 disable=1

然后编辑

/etc/mkinitcpio.conf

,添加:

FILES="/etc/modprobe.d/modprobe.conf"

最后执行命令,并重启:

sudo mkinitcpio -p linux

注意:

  1. 不确定这是最好的办法,因为要重启服务器
  2. 如果
    initramfs

    不是用默认的linux模板,那

    -p linux

    要做相应修改

Nginx全局变量释义

$args 此变量与请求行中的参数相等

$content_length 等于请求行的“Content_Length”的值。

$content_type 等同与请求头部的”Content_Type”的值

$document_root 等同于当前请求的root指令指定的值

$document_uri 与$uri一样

$host 与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

$limit_rate 允许限制的连接速率

$request_method 等同于request的method,通常是“GET”或“POST”

$remote_addr 客户端ip

$remote_port 客户端port

$remote_user 等同于用户名,由ngx_http_auth_basic_module认证

$request_filename 当前请求的文件的路径名,由root或alias和URI request组合而成

$request_body_file

$request_uri 含有参数的完整的初始URI

$query_string 与$args一样

$server_protocol 等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”

$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

$server_name 请求到达的服务器名

$server_port 请求到达的服务器的端口号

$uri 等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

本文出自 “学习要永恒” 博客

批量修改MySQL表前缀

在数据库设计中,对于某个特定的项目,一般对其所有的数据表指定相同的表前缀,如WordPress的数据表都是以wp_开头的,Discuz的数据表都是以dz_开头的。这样不但便于区分,更重要的作用在于可以避免将多个项目部署到同一个数据库时可能出现的表同名冲突。

那么,有如下这种情况时:

用户A和用户B都使用wordpress程序,现在他们想将程序放在一起,但是主机上只分配了一个数据库给他们,意味着他们的数据需要存放在一个数据库,问题是他们先前已经创建好了wordpress的数据库,并且使用了相同的表前缀,都使用了wp_,那么,怎样批量修改表前缀呢。

通过PHP脚本显然可以做到,在MySQL中修改表名的语句为

RENAME TABLE oldname TO newname

这里,我尝试采用纯SQL语句来实现,捣鼓了一阵子,于是有了下面这个存储过程:

-- @author xueyu
-- @desc modify the prefix of table name in db
-- @example
--
-- use DBNAME;
-- show tables;
-- source ~/change_prefix.sql;
--
-- call change_prefix('old_', 'new_', 'DBNAME');
--
-- show tables;
-- drop procedure if exists change_prefix;
--

delimiter //
DROP procedure IF EXISTS change_prefix //

CREATE procedure change_prefix(IN oldpre VARCHAR(200), IN newpre VARCHAR(200), IN dbname VARCHAR(200))
begin
  declare done INT DEFAULT 0;
  declare oldname VARCHAR(200);
  declare cur CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema= dbname AND table_name LIKE concat(oldpre,'%');
  declare continue handler FOR NOT found SET done = 1;
  open cur;

  repeat
    fetch cur INTO oldname;
    IF NOT done then
        SET @newname = concat(newpre, trim(LEADING oldpre FROM oldname));
        SET @sql = concat('rename table ',oldname,' to ',@newname);
        prepare tmpstmt FROM @sql;
        execute tmpstmt;
        deallocate prepare tmpstmt;
    end IF;
  until done end repeat;

  close cur;
end //

delimiter ;

使用方法很简单,直接导入这个脚本,然后运行

call change_prefix('old_', 'new_', 'DB_NAME');

即可,注意,脚本有删除change_prefix这句,如果你有同样命名的存储过程,注意去掉。用完之后,可以将这个存储过程删除掉。
我们可以批量给数据库里的所有表加上同样的前缀,第一个参数留即可

call change_prefix('', 'added_', 'DB_NAME');

同理,第二个参数留空可以去掉指定的表前缀。

CentOS 5/6 修改主机名(hostname)

需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常。首先切换到root用户。

/etc/sysconfig/network

用任一款你喜爱的编辑器打开该文件,里面有一行 HOSTNAME=localhost.localdomain (如果是默认的话),修改 localhost.localdomain 为你的主机名。

/etc/hosts

打开该文件,会有一行 127.0.0.1 localhost.localdomain localhost 。其中 127.0.0.1 是本地环路地址, localhost.localdomain 是主机名(hostname),也就是你待修改的。localhost 是主机名的别名(alias),它会出现在Konsole的提示符下。将第二项修改为你的主机名,第三项可选。

将上面两个文件修改完后,并不能立刻生效。如果要立刻生效的话,可以用 hostname your-hostname 作临时修改,它只是临时地修改主机名,系统重启后会恢复原样的。但修改上面两个文件是永久的,重启系统会得到新的主机名。

最后,重启后查看主机名 uname -n 。

andriod系统下sd卡各文件夹功能解析/清理SD卡必备!

下面是我们文件夹里通常能见到的文件。也不是非常全面,而且SD卡用久了,也会出现许多没用的,大家完全可以对照本文把没用的删除掉。如果有什么没有照顾到的还希望大家一起研究研究。
  1、.android_secure 是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了。
  2、.Bluetooth 顾名思义,用蓝牙之后就会有这个。
  3、.mobo 顾名思义,Moboplayer的缓存文件。
  4、.QQ 顾名思义,QQ的缓存文件。
  5、.quickoffice 顾名思义,quickoffice的缓存文件。
  6、.switchpro 顾名思义,switchprowidget(多键开关)的缓存文件。
  7、.ucdlres 顾名思义,UC迅雷的缓存文件。
  8、albumart 音乐专辑封面的缓存文件夹。
  9、albums 相册缩略图的缓存文件夹。
  10、Android 比较重要的文件夹,里面是一些程序数据,比如google map的地图缓存。
  11、backups 一些备份文件,比如联系人导出到SD卡时会导入到此文件夹。
  12、baidu 顾名思义,掌上百度、百度输入法之类程序的缓存文件夹。
  13、bugtogo 系统出现问题的时候会形成一些报告文件,存放于此文件夹。
  14、cmp 个人初步判断是音乐的缓存文件夹。
  15、data 同样是缓存数据的文件夹,与Android性质类似。
  16、DCIM 相机的缓存文件夹。
  17、documents DocumentsTo Go的相关文件夹。
  18、etouch 易行的缓存文件夹。
  19、extracted androzip等解压缩软件默认的解压目录。
  20、gameloft 顾名思义,gameloft游戏数据包存放的文件夹。
  21、handcent 顾名思义handcent(超级短信)数据文件夹。
  22、handyCurrency 货币汇率相关的文件夹,装了handycalc(科学计算器)之后才会有。
  23、ireader 顾名思义,ireader的缓存文件夹。
  24、KingReader 顾名思义,开卷有益的缓存文件夹。
  25、LazyList Applanet(黑市场)的缓存目录,也许和其他程序也有关,暂时不太清楚。
26、LOST.DIR卡上丢失或出错的文件会跑这里,此目录无用,删了会自动生成。
  27、moji 顾名思义,墨迹天气的缓存目录。
  28、MusicFolders poweramp产生的缓存文件夹。
  29、openfeint 顾名思义,openfeint的缓存文件夹。
  30、Picstore 图片浏览软件建立的一个目录。
  31、Playlists 播放列表的缓存文件夹。
  32、renren 顾名思义,人人网客户端的缓存文件夹。
  33、screenshot 截屏图片保存的目录,screenshot这个软件的。
  34、ShootMe顾名思义,shootme截屏后图片文件保存的目录。
  35、SmartpixGames SmartpixGames出品游戏的缓存文件夹,比如Jewellust。
  36、sogou 顾名思义,搜狗拼音的缓存文件夹。
  37、SpeedSoftware RE文件管理器的缓存文件夹。
  38、SystemAppBackupSystemApp remove(深度卸载)备份系统文件后,备份文件保存的目录。
  39、TalkingFriends talkingtom(会说话的tom猫)录制的视频文件所保存的目录。
  40、Tencent 顾名思义,腾讯软件的缓存目录,比如QQ。(与上面的.QQ文件夹并不相同)
  41、TitaniumBackup 顾名思义,钛备份备份的程序所保存的目录。
  42、TunnyBrowser 感觉是海豚浏览器的缓存目录,但不知道为什么叫这个名字,金枪鱼浏览器…..
  43、UCDLFiles UC迅雷下载文件的保存目录。
  44、UCDownloads UC浏览器下载文件的保存目录。
  45、VIE Vignette(晕影相机)的缓存目录。
  46、yd_historys Youdao 有道词典搜索历史的缓存目录。
  47、yd_speech 有道词典单词发音的缓存目录。
  48、youmicache 删掉后还会自动生成,悠米广告的缓存目录,广告程序内嵌在其他程序中。
  49、.新建文件夹 检查下是不是你自己放什么图的文件夹。。
  50、 sina 新浪微博
  51、playnow 索尼爱立信的在线商店playnow
  52、PlayerPro 好评最多的音乐播放器
  53、Mcdonalds 手机里的Mcdonalds软件的缓存,删除后,软件要重新联网下载才能使用。不建议删除
  54、mhc 手机里装了**软件后,**后的文件就在这里。
  55、sgsupdate 三国杀 的升级文件的安装包就在这
  56、 bluetooth手机蓝牙接收的文件默认在这里