通过伪造Referer来解决外链问题

什么是Referer?
Referer是HTTP Header的一个字段,当浏览器向服务器发送请求的时候一般会包含Referer信息,这一字段保存的是访客的来源URI。

以PHP为例,通过输出$_SERVER变量,你就可以看到HTTP_REFERER信息:

如今很多知名的网络相册(如网易相册、百度相册、51相册等等)都限制了外链,我不知道它们用什么方式实现,但是目前而言大多数防盗链的机制都是基于对Referer的判断来实现的。比如说,我有一个网站,其中一个页面地址是 http://example.com/test.html,里面需要外链一张猫扑的图片,因此,image.html里面可以这么写:

但是我们会发现这样外链的图片是无法显示出来的。原因在于,当我们访问http://example.com/test.html时,浏览器会向upload3.mop.com也就是猫扑的服务器发送一个请求,这一请求中包含的Referer信息应该就是这样:

http://example.com/test.html

这样,猫扑的服务器就可以判断出这是一个来自外部网站的请求,从而予以拒绝,这样我们就无法显示这张图片了。

那么,应该如何解决这一问题呢? 用火狐浏览器的可能知道,火狐有个插件叫做RefControl,可以用它来伪造Referer,从而正常显示图片。但是如果你是站长,你总不能要求你的 访客都使用火狐浏览器对吧?即便你所有的访客都使用火狐浏览器,你也很难保证他们都安装了RefControl这个插件。
这样,我们只能从程序方面入手解决问题:

<?php
ob_start();
$img=$_GET['url'];
&nbsp;
$host=$path=str_replace('http://','',$img);
$host=explode('/',$host);
$host=$host[0];
$path=strstr($path,'/');
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp)
{
	@fputs($fp, "GET $path HTTP/1.1\r\n");
	@fputs($fp, "Host: $host\r\n");
	@fputs($fp, "Accept: */*\r\n");
	@fputs($fp, "Referer: http://$host/\r\n");
	@fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n");
	@fputs($fp, "Connection: Close\r\n\r\n");
}
&nbsp;
$Content = '';
while ($str = fread($fp, 4096))
	$Content .= $str;
@fclose($fp);
$pos=strpos($Content,"\r\n\r\n");
$head=substr($Content,0,$pos);
$text=substr($Content,$pos+4);
header($head);
echo $text;
?>

实际上这就是通过伪造Referer来实现我们想要的效果。

我们把这段程序保存为redirect.php,放到服务器上,例如http://example.com/redirect.php,那么,接下来我们只需要将原来的外链图片地址经由这段程序处理,就可以正常显示。

[来源]

JavaScript获取页面宽度高度大全

网页可见区域宽:document.body.clientWidth
网页可见区域高:document.body.clientHeight
网页可见区域宽:document.body.offsetWidth(包括边线的宽)
网页可见区域高:document.body.offsetHeight(包括边线的宽)
网页正文全文宽:document.body.scrollWidth
网页正文全文高:document.body.scrollHeight
网页被卷去的高:document.body.scrollTop(IE7无效)
网页被卷去的左:document.body.scrollLeft(IE7无效)

网页被卷去的高:document.documentElement.scrollTop(IE7有效)

网页被卷去的左:document.documentElement.scrollLeft(IE7有效)
网页正文部分上:window.screenTop
网页正文部分左:window.screenLeft
屏幕分辨率的高:window.screen.height
屏幕分辨率的宽:window.screen.width
屏幕可用工作区高度:window.screen.availHeight
屏幕可用工作区宽度:window.screen.availWidth

相对于窗口左上角的X:window.event.clientX

相对于窗口左上角的Y:window.event.clientY
相对于整个页面的X:window.event.X
相对于整个页面的Y:window.event.Y

 

第二次笔记

 

 

关于获取各种浏览器可见窗口大小的一点点研究,这里面有些在兼容性不是很好,请看后面的介绍。
<script>
function getInfo()
{
var s = “”;
s += ” 网页可见区域宽:”+ document.body.clientWidth;
s += ” 网页可见区域高:”+ document.body.clientHeight;
s += ” 网页可见区域宽:”+ document.body.offsetWidth + ” (包括边线和滚动条的宽)”;
s += ” 网页可见区域高:”+ document.body.offsetHeight + ” (包括边线的宽)”;
s += ” 网页正文全文宽:”+ document.body.scrollWidth;
s += ” 网页正文全文高:”+ document.body.scrollHeight;
s += ” 网页被卷去的高(ff):”+ document.body.scrollTop;
s += ” 网页被卷去的高(ie):”+ document.documentElement.scrollTop;
s += ” 网页被卷去的左:”+ document.body.scrollLeft;
s += ” 网页正文部分上:”+ window.screenTop;
s += ” 网页正文部分左:”+ window.screenLeft;
s += ” 屏幕分辨率的高:”+ window.screen.height;
s += ” 屏幕分辨率的宽:”+ window.screen.width;
s += ” 屏幕可用工作区高度:”+ window.screen.availHeight;
s += ” 屏幕可用工作区宽度:”+ window.screen.availWidth;
s += ” 你的屏幕设置是 “+ window.screen.colorDepth +” 位彩色”;
s += ” 你的屏幕设置 “+ window.screen.deviceXDPI +” 像素/英寸”;
//alert (s);
}
getInfo();
</script>
在我本地测试当中:

在IE、FireFox、Opera下都可以使用
document.body.clientWidth
document.body.clientHeight
即可获得,很简单,很方便。
而在公司项目当中:
Opera仍然使用
document.body.clientWidth
document.body.clientHeight
可是IE和FireFox则使用
document.documentElement.clientWidth
document.documentElement.clientHeight;
原来是W3C的标准在作怪啊
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
如果在页面中添加这行标记的话
在IE中:
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
在FireFox中:
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
?
在 Opera中:
document.body.clientWidth ==> 可见区域宽度
document.body.clientHeight ==> 可见区域高度
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)
document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
而如果没有定义W3C的标准,则
IE为:
document.documentElement.clientWidth ==> 0
document.documentElement.clientHeight ==> 0
FireFox为:
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)
document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
Opera为:
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)
document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)

真是一件麻烦事情,其实就开发来看,宁可少一些对象和方法,不使用最新的标准要方便许多啊。

[来源]

stdClass object的处理

php取回的json数据是stdClass,要将数据处理成数组,需要用get_object_vars函数,但是该函数只能将第一级对象转为数组

例子:
$back_info = file_get_contents(“http://xxxx/act/cps_api/gamelist/index/?game_ids=” . $ids);
$back_temp = json_decode($back_info);
$back = get_object_vars($back_temp);
foreach ($back as $k => $v) {
print_r($k);
echo “<br />”;
print_r($v);
exit;
}
输出:
97<br />stdClass Object
(
    [game_name] => 神仙道
    [server_info] => stdClass Object
        (
            [894] => stdClass Object
                (
                    [server_number] => 双线94区
                    [server_name] => 九鼎记事
                    [game_url] => http://xxxx/webgame/index/sxd/s94?from=0gsp_cps2345&source=cps&from_ly=cps2345
                )
        )
)
如果要访问stdClass的某个子元素:例$v->game_name

ZendStudio 8 FTP设置

功能简介:

在zend studio 里开发php项目,修改*.php文件后自动同步修改服务器端对应*.php文件( 应该是任意格式的对应文件,不仅仅是php )

告别需要点击esftp插件才能将文件上传到服务器端的历史,提高开发效率

配置流程:

1.本地和服务器部署项目代码

2.zend studio配置ssh/ftp

3.测试通过

开干:

1.先在zend studio新建/导入你自己的项目(该项目需要和服务器上的目录结构对应,服务器部署代码略)

2.在php explorer窗口(即项目代码窗口)鼠标右键某php项目

–>properties

–>remote server support

–>选择 enable remote connection properties

–>manage

host name: 设置连接备注名称

system type:ssh/ftp

–>finish

–>host name: 服务器ip  port:端口号

username: 帐号

password:密码

initial directory: 服务器项目代码对应路径 (例如:/var/www/html/项目名称)

–>test connection 测试一下联通性 成功返回 connection successful

–>finish

project directory: / (相对路径,一般为/)

upload files: on save (保存本地php时同步到服务器)

–> 当服务器没有代码时可以选择yes将本地代码全部上传到服务器,服务器上已经部署代码选择no

–>搞定

3.测试打开你项目下任意一个php 写任意内容进去保存,然后到服务器上对比这个文件是否同本地一致即可。

补充注意事项:

1.   8.0的ssh或ftp第一次使用时默认同步全部目录,你不选择同步全部目录就可以了

                   这样就不用全部目录同步了,以后你保存某一个文件才同步

             2.   8.0针对你有一台开发机的时候效率非常高

3.   不建议当作上线工具使用,网络出现问题时候需要多试几次 test connect 就可以了

 

zend 8.0和6.0  死机的情况主要有一下几点

               1.  上传文件到服务器过程时, 网络不稳定出现丢包情况

2.  上传文件到服务器过程时, 电脑某程序突然消耗太多内存比如某些程序更新

3.  上传a文件到服务器过程时, 你又重复保存a或上传a文件

不喜欢用zend的可以用 secure CRT 在ssh下直接用 vi 编程,手熟以后远比zend效率高,因为在机房或者linux环境下没人给你装zend

[来源]

URL和URI

1.什么是URI

Web上可用的每种资源 – HTML文档、图像、视频片段、程序等 – 由一个通过通用资源标志符(Universal Resource Identifier, 简称”URI”)进行定位。

URI一般由三部分组成:

访问资源的命名机制。

存放资源的主机名。

资源自身的名称,由路径表示。

考虑下面的URI,它表示了当前的HTML 4.0规范:

     http://www.webmonkey.com.cn/html/html40/

这个URI是这样的:这是一个可通过HTTP协议访问的资源,位于主

www.webmonkey.com.cn上,通过路径“/html/html40”访问。在HTML文档中

其它资源包括”mailto”(收发email)和”ftp”(FTP访问)。

这是URI的另一个例子,指向一个用户的邮箱:

<A href=”Joe’>mailto:joe@someplace.com”>Joe Cool</A>

注:大多数读者可能熟悉”URL”,而不是URI。URL是RUI命名机制的一个子集。

片段标志符

有的URI指向一个资源的内部。 这种URI以”#”结束,并跟着一个anchor标志

符(称为片段标志符)。例如,下面是一个指向section_2的URI:

http://somesite.com/html/top.htm#section_2

相对URI

相对URI 不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相

对URI可能含有相对路径(如,“..”表示上一层路径),还可能包含片段标

志符。

为了说明相对URI,假设我们有一个基本的URI http://www.acme.com/support/intro.htm

下面的链接中使用了相对URI:

     <A href=”suppliers.htm”>Suppliers</A>

它扩展成完全的URI就是 “http://www.acme.com/support/suppliers.htm“,

下面是一个图像的相对URI:

     <IMG src=”../icons/logo.gif” alt=”logo”>

它扩展成完全的URI就是 “http://www.acme.com/icons/logo.gif“。

在HTML中,URI被用来:

链接到另一个文档或资源(参看A和LINK元素)。

链接到一个外部样式表或脚本(参看LINK和SCRIPT元素)。

在页内包含图像、对象或applet(参看IMAG、OBJECT、APPLET和INPUT

元素)。

建立图像映射(参看MAP和AREA元素)。

提交一个表单(参看FORM)。

建立一个框架文档(参看FRAME和IFRAME元素)。

引用一个外部参考(参看Q、BLOCKQUOTE, INS和DEL元素)。

指向一个描述文档的metadata(参看HEAD元素)。

2.什么是URL:

       URL是Uniform Resource Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

◇ URL的格式

URL的格式由下列三部分组成:

第一部分是协议(或称为服务方式);

第二部分是存有该资源的主机IP地址(有时也包括端口号);

第三部分是主机资源的具体地址。,如目录和文件名等。

第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。

◇ URL示例

文件的URL:

用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。

例一:file://ftp.yoyodyne.com/pub/files/foobar.txt

代表存放主机ftp.yoyodyne.com上的pub/files/目录下的一个文件,文件名是foobar.txt。

例二:file://ftp.yoyodyne.com/pub

代表主机ftp.yoyodyne.com上的目录/pub。

例三:file://ftp.yoyodyne.com/

代表主机ftp.yoyodyne.com上的根目录。

Gopher的URL:

Gopher服务器有可能使用特殊的端口,在这种情况下,主机IP地址与端口之间要用“:隔开。

例一:gopher://gopher.yoyodyne.com/

表示主机gopher.yoyodyne.com上的gopher服务器。

例二:gopher://gopher.banzai.edu:1234

表示主机gopher.banzai.edu上的gopher服务器,在端口1234上。

网络新闻的URL:

利用URL表示网络新闻组时,如果是usenet的话只要指定出新闻组的名字即可。

例如:news:rec.gardening

表示usenet上的rec.gardening新闻组(园艺)。

HTTP的 URL:

使用超级文本传输协议HTTP,提供超级文本信息服务的资源。

例一:http://www.peopledaily.com.cn/channel/welcome.htm

其计算机域名为www.peopledaily.com.cn。超级文本文件(文件类型为.html)是在目录/channel下的welcome.htm。这是中国人民日报的一台计算机。

例二:http://www.rol.cn.net/talk/talk1.htm

其其计算机域名为www.rol.cn.net。超级文本文件(文件类型为.html)是在目录/talk下的talk1.htm。这是瑞得聊天室的地址,可由此进入瑞得聊天室的第1室。

URI、URL和URN之间的区别与联系

URI:Uniform Resource Identifier,统一资源标识符;

URL:Uniform Resource Locator,统一资源定位符;

URN:Uniform Resource Name,统一资源名称。

其中,URL,URN是URI的子集。

Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式:

URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。

URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。

URI是以某种统一的(标准化的)方式标识资源的简单字符串。

URI一般由三部分组成:

1. 访问资源的命名机制。

2. 存放资源的主机名。

3. 资源自身的名称,由路径表示。

典型情况下,这种字符串以scheme(命名URI的名字空间的标识符——一组相关的名称)开头,语法如下:

[scheme:] scheme-specific-part

URI以scheme和冒号开头。Scheme用大写/小写字母开头,后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由URI的名字空间决定。如下面的例子:

http://www.cnn.com,其中http是scheme,//www.cnn.com是 scheme-specific-part,并且它的scheme与scheme-specific-part被冒号分开了。

URI有绝对和相对之分,绝对的URI指以scheme(后面跟着冒号)开头的URI。前面提到的http://www.cnn.com就是绝对的URI的一个例子,其它的例子还有mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz://whatever。你可以把绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比,绝对的URI类似于从根目录开始的某个文件的径。

与绝对的URI不同的,相对的URI不是以scheme(后面跟着冒号)开始的URI。 它的一个例子是articles/articles.html。你可以把相对的URI看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境。如果用文件系统作类比,相对的URI类似于从当前目录开始的文件路径。

URL是Uniform Resource Location的缩写,译为”统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL的格式由下列三部分组成:

第一部分是协议(或称为服务方式);

第二部分是存有该资源的主机IP地址(有时也包括端口号);

第三部分是主机资源的具体地址。,如目录和文件名等。

第一部分和第二部分之间用”://”符号隔开,第二部分和第三部分用”/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。

目前最大的缺点是当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI(Universal Resource Identifier)即”通用资源标识”(参见RFC 1630)、URN(Uniform Resource Name)即”统一资源名”和URC(Uniform Resource Citation)即”统一资源引用符”等。

URI目前还处在进一步的研究当中。研究的方向就是弥补URL目前存在的缺点。

———————————————-

简单理解就是URL是大门,URI是门里的每个屋子。

URL:

URL是Uniform Resource Location的缩写,既然楼主知道我就不啰嗦了

URI 是在 Internet 上定位资源的常规方案,它的着重点在于资源,而不是位置。理论上,URI 可以查找镜像文档的最近的副本,或者定位从一个站点移动到另一个站点的文档。

URI是Web上可用的每种资源 – HTML文档、图像、视频片段、程序等 – 由一个通过通用资源标志符(Universal Resource Identifier, 简称”URI”)进行定位。

URI一般由三部分组成:

1. 访问资源的命名机制。

2. 存放资源的主机名。

3. 资源自身的名称,由路径表示。

注:大多数人可能熟悉”URL”,而不是URI。URL是URI命名机制的一个子集。

区别就是URI定义资源,而URL不单定义这个资源,还定义了如何找到这个资源。 比如说,一个服务器上,到一个文件夹/网页的绝对地址(absolute path)就是URI。

 

PHP中的NULL,”” ,0,”0″,1

$var             =    NULL      ""       0       "0"      1

strlen($var)     =    0         0        1        1       1
is_null($var)    =    TRUE    FALSE    FALSE    FALSE    FALSE
$var == ""       =    TRUE     TRUE     TRUE    FALSE    FALSE
!$var            =    TRUE     TRUE     TRUE     TRUE    FALSE
!is_null($var)   =    FALSE    TRUE     TRUE     TRUE     TRUE
$var != ""       =    FALSE    FALSE    FALSE    TRUE     TRUE
$var             =    FALSE    FALSE    FALSE    FALSE    TRUE

 

mysql随机数

若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:

SELECT FLOOR(7 + (RAND() * 6));

Js将unix时间戳转化成年月日时分秒格式

<div id="unixToYmd">
            <p>
                Unix时间戳:<input style="width:120px;height:18px;" type="text" name="timeStamp" id="timeStamp" />
                <input type="button" name="switch" id="switch" name="switch" value="转换" />
                时间日期:<input style="width:250px;height:18px;" type="text" name="ymd" id="ymd" />
            </p>  
 </div>
 <script language="javascript">
  jQuery(document).ready(function(){
            $('#switch').click(function(){
                var timeStamp=$('#timeStamp').val();
                reg=/^\d+$/;
                if((timeStamp!='') && (reg.test(timeStamp))) {
                    var ymd=new Date();
                    ymd.setTime(timeStamp*1000);
                    var year=ymd.getFullYear().toString();
                    var month=(ymd.getMonth()+1).toString();
                    var date=ymd.getDate().toString();
                    var hour=ymd.getHours().toString();
                    var minute=ymd.getMinutes().toString();
                    var second=ymd.getSeconds().toString();
                    $('#ymd').val(year+'-'+month+'-'+date+' '+hour+':'+minute+':'+second);
                }
                else {
                    alert('请输入unix时间戳(秒)');
                }
            });   
  });
 </script>