apache防盗链,包容google reader和搜索及其破解方法
博客图片有些多了,盗链的问题也严峻了。但是不能把搜索引擎排除在外。
于是要优化下防盗链的设置,把下面的设置改成你自己的。放到你的apache 服务器的httpd.conf配置文件里面。
如果有多个虚拟机,请分别在virtualhost字段块中写入下列配置,并限定好域名。
如果你写在外面,那可是对全局网站都起作用哦。
1 SetEnvIfNoCase Referer "^http://.*\.qq\.com" locally_linked=1
2 SetEnvIfNoCase Referer "^.*\netroby\.com" locally_linked=1
3 SetEnvIfNoCase Referer "^http://.*\.xgyl\.net/" locally_linked=1
4 SetEnvIfNoCase Referer "^.*\.xgyl\.net$" locally_linked=1
5 SetEnvIfNoCase Referer "^http://.*\.google\.com" locally_linked=1
6 SetEnvIfNoCase Referer ".*\.google\.com" locally_linked=1
7
8 SetEnvIfNoCase Referer "^$" locally_linked=1
9 <FilesMatch "\.(gif|png|jpe?g)$">
10 Order Allow,Deny
11 Allow from env=locally_linked
12 </FilesMatch>
13
http://www.netroby.com/article-991.html
相关知识:
一、<Files>
语法:<Files filename> ... </Files>
作用域:server config, virtual host, directory, .htaccess
<Files>指令提供了基于文件名的访问控制,类似于<Directory>和<Location>指令。它将配对一个</Files>指令。在此配置段中定义的指令将作用于其基本名称(
不是完整的路径)与指定的文件名相符的对象。<Files>段将根据它们在配置文件中出现的顺序被处理:在<Directory>段和.htaccess文件被处理之后,但在
<Location>段之前。请注意:<Files>能嵌入到<Directory>段中以限制它们作用的文件系统范围。
filename参数应当是一个文件名或是一个包含通配符的字符串,其中"?"匹配任何单个字符,"*"匹配任何字符串序列。在"~"字符之后同样可以使用正则表达式。
比如:
A、加上了“~”,如果不加则无法使用正则表达式
<Files ~ "\.(gif|jpe?g|png)$">
B、详细例子
<Directory /www>
<Files files.html>
Order allow,deny
Deny from all
<Files>
<Directory>
//www目录下的所有files.html文件都无法访问。比如/www/files.html、/www/766.com/files.html这些文件都无法访问
将匹配绝大部分常见的因特网图象格式。然而在Apache1.3及其后继版本中,更推荐使用<FilesMatch>指令。
请注意与<Directory>和<Location>配置段不同的是:<Files>配置段可用于.htaccess文件当中。这将允许用户在文件层面上控制对它们自己文件的访问。
2、<FilesMatch> 指令
说明 包含作用于与正则表达式匹配的文件名的指令
语法 <FilesMatch regex> ... </FilesMatch> //regex为正则表达式。
欲了解正则表达式:http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
作用域 server config, virtual host, directory, .htaccess
<FilesMatch>指令就像<Files>指令一样提供了针对文件名的访问控制。然而,它使用的是正则表达式。比如说:
<FilesMatch "\.(gif|jpe?g|png)$"> //与<Files ~ "\.(gif|jpe?g|png)$">一样。
将匹配最常见的internet图形文件格式。
PHP伪造来源HTTP_REFERER的方法讨论
Author:Flymorn Source:飘易博客
Categories:PHP编程 PostTime:2008-4-5 0:16:56
正 文:
如今网络上十分流行论坛自动发帖机,自动顶贴机等,给众多论坛网站带来了大量的垃圾信息,许多网站只是简单地采用了判断HTTP_REFERER 的值来进行过滤机器发帖,可是网页的HTTP_REFERER来路信息是可以被伪造的。任何事物都是双面刃,只要你善于利用就有其存在价值。
很早以前,下载软件如Flashget,迅雷等都可以伪造来路信息了,而这些软件的伪造HTTP_REFERER大多是基于底层的sock来构造虚假的 http头信息来达到目的。本文就纯粹从技术角度讨论一下,php语言下的伪造HTTP_REFERER的方法,以期让大家了解过程,更好的防御。
环境:Apache/2.2.8 + PHP/5.2.5 + Windows XP系统,本地测试。
首先,在网站虚拟根目录下建立1.php和2.php两个文件。
其中,1.php文件内容如下:
1 <?php
2 $host = '127.0.0.1';
3 $target = '/2.php';
4 $referer = 'http://www.piaoyi.org'; //伪造HTTP_REFERER地址
5 $fp = fsockopen($host, 80, $errno, $errstr, 30);
6 if (!$fp){
7 echo "$errstr($errno)<br />\n";
8 }
9 else{
10 $out = "
11 GET $target HTTP/1.1
12 Host: $host
13 Referer: $referer
14 Connection: Close\r\n\r\n";
15 fwrite($fp, $out);
16 while (!feof($fp)){
17 echo fgets($fp, 1024);
18 }
19 fclose($fp);
20 }
21 ?>
另一个2.php文件很简单,只是写上一行读取当前的HTTP_REFERER服务器值的代码即可,如下:
<?php
echo "<hr />";
echo $_SERVER["HTTP_REFERER"];
?>
执行1.php文件,打开http://localhost/1.php,页面返回信息如下:
HTTP/1.1 200 OK Date: Fri, 04 Apr 2008 16:07:54 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Content-Length: 27 Connection: close Content-Type: text/html; charset=gb2312
--------------------------------------------------------------------------------
http://www.piaoyi.org
看到了结果了吧,伪造来源HTTP_REFERER信息成功。所以,如果你的网站仅仅是判断HTTP_REFERER,并不是安全的,别人一样可以构造这样的来源,简单的防御方法就是验证页里加上验证码;还可以结合IP判断的方法。
补充:ASP下的伪造来源的代码如下:
<%dim http
set http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以
Http.open "GET",url,false
Http.setRequestHeader "Referer","http://www.piaoyi.org/"
Http.send() %>
如果你是一个有心人,请不要恶意利用这些方法,毕竟坏事做多了的话,效果就过犹不及了;比如你发大量的垃圾帖子吧,可能短期内会给你带来大量的外部链接,但这样的黑帽手段迟早要被搜索引擎发现,而这些已经发出去的链接就好像泼出去的水一样收不回来,这样的罪证就不是你能控制的了。
来源:
http://www.piaoyi.org/php/PHP-HTTP_REFERER-Forgery.html
判断referer的php代码:
伪造referer实例代码,主要用于一些突破防盗链
这里就直接给出完整的程序吧,具体的应用可以自己修改。
我这里给出的例子是很简单的,其实可以从这个例子中发展出很多的应用。比如隐藏真实的URL地址……嘿嘿,具体的就自己分析去吧
这里新建一个文件file.php。后面的参数就是需要伪造referfer的目标地址吧。如:file.php/http://www.xxx.xxx/xxx.mp3
以下为引用的内容:
<?
$url=str_replace('/file.php/','',$_SERVER["REQUEST_URI"]);//得出需要转换的网址。这里我就偷懒,不做安全检测了,需要的自己加上去
$downfile=str_replace(" ","%20",$url);//替换空格之类,可以根据实际情况进行替换
$downfile=str_replace("http://","",$downfile);//去掉http://
$urlarr=explode("/",$downfile);//以"/"分解出域名
$domain=$urlarr[0];//域名
$getfile=str_replace($urlarr[0],'',$downfile);//得出header中的GET部分
$content = @fsockopen("$domain", 80, $errno, $errstr, 12);//连接目标主机
if (!$content){//链接不上就提示错误
die("对不起,无法连接上 $domain 。");
}
fputs($content, "GET $getfile HTTP/1.0\r\n");
fputs($content, "Host: $domain\r\n");
fputs($content, "Referer: $domain\r\n");//伪造部分
fputs($content, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
while (!feof($content)) {
$tp.=fgets($content, 128);
if (strstr($tp,"200 OK")){ //这里要说明一下。header的第一行一般是请求文件的状态。具体请参照HTTP 1.1状态代码及其含义 hi.baidu.com/110911/blog/item/21f20d2475af812ed50742c5.html这里是正常的文件请求状态,只需直接转向就可以。其他状态的继续执行程序
header("Location:$url");
die();
}
}
//302 转向,大部分的防盗链系统都是先判断referfer,对了的话再转向真实的地址。下面就是获取真实的地址。
$arr=explode("\n",$tp);
$arr1=explode("Location: ",$tp);//分解出Location后面的真时地址
$arr2=explode("\n",$arr1[1]);
header('Content-Type:application/force-download');//强制下载
header("location:".$arr2[0]);//转向目标地址
die();
?>
这段程序只能针对使用referer来判断是否盗链的防盗链系统,使用其他特殊方法防盗链的,这个估计就不适用了
浙公网安备 33010602011771号