简单防盗链实现代码
防盗链的技术已经很普遍了,有些网站不喜欢自己的图片被别的网站直接复制使用,便使用了防盗链的技术,这样别人在直接复制使用网站图片时,图片便会按照程序的设定不显示或显示防盗链等字样。
使用了防盗链技术,不仅可以防止自己的图片被盗用,也可以节省自己站点下载图片的流量,觉得还是蛮不错的说,那么在PHP环境下应该如何防止盗链呢?在PHP环境下我们知道通常都是使用Apache服务器,那么主要看下Apache防盗链的方法吧,其实IIS也是同一个原理。
http协议的-http请求头信息(request)
Accept: */* 【表示客户端可以接受任何数据】
Referer: http://localhost:80/test/abc.html 【1.表示我是从哪里来】
Accept-Language: zh-cn 【页面语言】
User-Agent: Mozilla/4.0 【告诉服务我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate 【表示接受什么样的数据压缩格式.】
Host: localhost:80 【主机:80】
Connection: Keep-Alive 【表示不要立即断掉我们的请求.】
<?php // 防盗链:检查进入页面的路径是否存在,存在即是有明确的来源路径,不存在即是来源路径不明(或是直接地址栏输入或是点击打开.html文件) // 防止自己的图片被别的网站直接复制使用,图片便会按照程序的设定不显示或显示防盗链等字样。 if (isset($_SERVER['HTTP_REFERER'])) { // 判断isset($_SERVER['HTTP_REFERER']是不是http://localhost开头的 if (strpos(isset($_SERVER['HTTP_REFERER']),"http://localhost")==0) { echo "welcome,you are right"; // echo strpos($_SERVER['HTTP_REFERER'],"localhost"); }else{ // 跳转 header("location:404.php"); } }else{ header("location:404.php"); } // echo "this is a new page"; ?>
Apache防盗链
大多数的虚拟主机都是Apache的,因此最方便的防盗链设置莫过于利用.htaccess文件(这个文件不能直接创建的;可以cmd命令行创建;或者使用编辑器创建另存)了。网上搜索下方法很多,于是我总结了下,绝对好用的方法。把下面的代码添加到.htaccess文件里,修改下即可。
RewriteEngine on//开启重写规则
RewriteCond %{HTTP_FILENAME}.*.(jpg|jpeg|png|gif)[NC]//对规定文件进行防盗处理 [NC]不区分大小写 RewriteCond %{HTTP_REFERER} !^http://localhost/.*$[NC]//判断来源若不是该路径则改写为nopic.png RewriteRule.*nopic.png//这张图片可以自定义
代码解释:
先看最后一行,我对网站上的png、jpg、gif文件做了防盗链保护,一旦我网站里的图片在上述白名单之外的网站里出现,全部显示最后一行代码中的图片。
Nginx防盗链
Nginx不支持.htaccess,设置起来稍微麻烦了点。首先要用文本编辑器打开/usr/local/nginx/conf/nginx.conf这个文件(如果你使用的是vhost,则到vhost里找相应的conf文件),将如下代码匹配在server{ }段里面即可,注意我说的不是拷贝,而是匹配。
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; valid_referers none blocked *.ilucong.com *.youdao.com *.zhuaxia.com *.xianguo.com *.google.cn *.google.com *.google.com.tw *.google.com.sg *.google.com.hk *.bloglines.com image.soso.com cn.bing.com image.baidu.com *.feedburner.com *.feedsky.com; if ($invalid_referer) { rewrite ^/ ; #return 404; } }
注意:尽量不要使用windows自带的记事本编辑,可能会出现乱行;编辑完之后,重启Ngnix服务方可生效
反盗链原理
既然服务器使用HTTP_REFERER来匹配进行反防盗链,我们可以顺着这条线来进行反防盗链,即我们伪造HTTP_REFERER成服务器需要的信息,原理就是:服务器需要什么,我们则伪造什么。
反防盗链php referrer.php内容如下
<?php require('./http.class.php');//此类为上一篇日志的 php实现的http类 $http = new Http('http://localhost/foruser/HTTP/hello.png'); //我们伪造服务器需要的头信息Referer $http->setHeader("HTTP_REFERER: http://localhost"); $res = $http->get(); echo $res; //将图片信息截图保存下来 file_put_contents('./a.png',substr(strstr($res,' '),4)); ?>
http请求两种主要的方式
get / post
get 和post的区别有哪些
<form action="a.php" method="post"> <input type="text" name="name"/> <input type="submit" value="post">//post请求的数据,放在http协议的消息体 </form> <form action="a.php" method="post"> <input type="text" name="name"/> <input type="submit" value="get">//get 请求的数据会显示在 地址栏上 </form>
安全性 get 请求的数据会显示在 地址栏上, post请求的数据,放在http协议的消息体
从可以提交数据的大小看,http协议本身并没有限制数据大小。浏览器在对get 和post请求做显示, get 请求数据 2k+35 ,post没有限制。
get请求可以更好的添加到收藏夹..