2008年6月

http协议的header详解(为了解决客户数据的多播)

很荣幸的在Lpzq项目中,有机会的用http协议的header解决了应用程序与web程序用户认账接口
这里又遇到一个网站客户提交数据的多播(暂时无法描述清楚,因为它不是表单多提交就能解决的).
废话和说,看看别人的经典入门教程:

WEB服务器和浏览器之间的一问一答的交互过程也得遵循一定的规则,这个规则就是HTTP协议。它是TCP/IP协议集中的一个应用层协议,用于定义浏览 器和WEB服务器之间交换数据过程以及数据本身的格式。现在被广泛使用的HTTP/1.1相对HTTP/1.0而言,最大的特点就是支持持续连接。

1.HTTP/1.0的会话方式:

建立连接,发送请求信息
----------------------------------------------------->
客户机 服务器
<-------------------------------------------------------
关闭连接,回送响应消息

每次连接只处理一个请求,即使是对同一个网站的每一个页面的访问,浏览器和WEB服务器都要建立一次单独的连接。

2.HTTP/1.1的会话方式:

建立连接,第1个请求信息
-------------------------------------------------------------------------->
............
发送第N请求信息
-------------------------------------------------------------------------->
客户机 回送第1次响应 服务器
<--------------------------------------------------------------------------
..............
回应第n次响应
<--------------------------------------------------------------------------
发送关闭连接请求
-------------------------------------------------------------------------->
关闭连接
<--------------------------------------------------------------------------

HTTP/1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图象的网页文件的多个请求和响应可以在一个连接中传输,但每个单独的网页文件的请求和响应仍然需要使用各自的连接,还允许客户端不用等待上一次请求结果返回就可以发送下一个请求。

HTTP消息的格式:
一个完整的请求消息包括:一个请求行、若干消息头、以及实体内容。
一个完整的响应消息包括:一个状态行、若干消息头、以及实体内容。

请求的格式为:
请求消息 = 请求行(通用信息|请求头|实体头) CRLF[实体内容]
请求 行 = 方法 请求URL HTTP版本号 CRLF
方  法 = GET|HEAD|POST|扩展方法
U R  L = 协议名称+宿主名+目录与文件名
HEAD——要求服务器查找某对象的元信息,而不是对象本身。
POST——从客户机向服务器传送数据,在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容,让CGI程序处理。
一个请求的例子为:
GET http://networking.zju.edu.cn/zju/index.htm HTTP/1.0

下面对这几个部分再做个详细的解说:
1.请求行:包括三个部分,即请求方式、资源路径、以及使用的HTTP协议版本。语法如下:请求方式资源路径 HTTP版本号,其中表示回车和换行这两个字符的组合。HTTP请求方式包括POST、GET、HEAD、OPTIONS、DELETE、TRACE和PUT几种。常用的是前两种。
2.状态行:包括HTTP协议的版本号、一个状态码、以及对状态码进行描述的文本信息。
语法如下:HTTP版本号 状态码 原因叙述

使用GET和POST传递参数:
在URL地址后面可以附加一些参数,每个参数都由参数名和参数值组成,中间用=分隔,各个参数用&分隔,URL地址和整个参数之间用?分隔,如下所示:
http://www.it315.org/servlet/ParamsServlet?param1=aaa¶m2=bbb
使用GET传递参数的数据量是有限的,一般限制在1KB以下。使用POST比GET要大的多。是没有限制的。但是必须设置Content=Type消息头为‘application/x-www-form-urlencoded’和设置Content-Length消息头为实体内容的长度。

响应状态码:

常见如:
200:表示一切正常,返回的是正常请求结果。
404:表示服务器上不存在客户机上所请求的资源,这个状态码在浏览网页时最常见的。

具体如下:

HTTP响应码
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。

响应码分五种类型,由它们的第一位数字表示:
1.1xx:信息,请求收到,继续处理
2.2xx:成功,行为被成功地接受、理解和采纳
3.3xx:重定向,为了完成请求,必须进一步执行的动作
4.4xx:客户端错误,请求包含语法错误或者请求无法实现
5.5xx:服务器错误,服务器不能实现一种明显无效的请求

(后附详细响应码列表)

通用信息头:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
Cache-Control:此字段用于通知客户机和服务器之间的代理服务器如何使用已缓存的页面。
Connection:用于指定处理完本次请求/响应后,客户端和服务器是否还要继续保持连接。
Date:用于表示HTTP消息产生的当前时间。
Transfer-Encoding:用于指定实体内容的传输编码方式。

请求头:允许客户端传递关于自身的信息和希望的响应形式。
Accept:用于指定客户端程序能够处理的MIME类型。有多个时用逗号隔开。
Accept-Charset:指出客户端程序可以使用的字符集。有多个时用逗号隔开。
Accept-Encoding:指定客户机能够进行解码的数据编码方式。有多个时用逗号隔开。
Accept-Language:指定客户机期望服务器返回哪个国家语言的文档。有多个时用逗号隔开。
Host:指定资源所在的主机名和端口号。

响应头:服务器和于传递自身信息的响应。
Accept-Range:用于说明当前WEB服务器是否接受Range请求和Range请求中指定的数据的单位。
Location:用于通知客户机应该到哪个新的地址去获取文档。由于当前响应并没有直接返回内容给客户机,所以使用Location头的HTTP消息不应该有实体内容,由此可见,在消息头中不能同时出现Location和Contect-Type这两个头自段。

实体头:定义被传送资源的信息。即可用于请求,也可用于响应。
Allow:用于指定客户机请求的资源所支持的请求方法。
Content-Encoding:用于指定实体内容的压缩编码方式。
Content-Language:用于指定返回的网页文档的国家语言类型。
Content-Length:用于指定实体内容的长度。
Content-Location:用于指定响应消息中所封装的实体内容的实际位置路径。
Content-Type:用于指定实体内容的MIME类型。客户机通过检查服务器响应消息的此字段中的MIME类型就能知道实体内容的数据格式和知道以 何种方式来进行处理了。安装目录下的conf目录下的web.xml文件里面就定义了很多的类型。
Last-Modified:用于指定文档的最后修改时间。

扩展头:
Refresh:此字段告诉浏览器隔多长时间刷新。

下面简要介绍一下HTTP协议的请求头和应答头,这将有助于你进一步了解某些测试工具录制脚本的原理,便于编辑性能测试脚本。请求头和应答头都将用实例来说明。

请求消息举例:
POST /bbs/login2.asp?action=chk HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://127.0.0.1/inpage.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; (R1 1.3))
Host: 127.0.0.1Content-Length: 69
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: aspsky=StatUserID=2200878793; Cookie1=y; ASPSESSIONIDQQTBSRCB=BHHIOGHAGFCKKNCGLLHDFHBM
username=snappyboy&CookieDate=0&password=123456&Submit3=%B5%C7%C2%BC

请求消息的第一行为下面的格式:

Method Request-URI HTTP-Version CRLF

例如:POST /bbs/login2.asp?action=chk HTTP/1.1

Method表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。
方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。
GET方法取回由Request-URI标识的信息。
HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。
POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。

Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。

HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。

CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列 字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、 From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If- Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User- Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

Host头域
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

Referer头域
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由 于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

Range头域
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节: bytes = 0 - 499
表示第二个500字节: bytes = 500 - 999
表示最后500个字节: bytes = -500
表示500字节以后的范围: bytes = 500-
第一个和最后一个字节: bytes = 0-0 , -1
同时指定几个范围: bytes = 500-600, 601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(Partial Content)返回而不是以200(OK)。

User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。

Cache-Control头域(请求和应答通用头域)
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存 处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:
Public 指示响应可被任何缓存区缓存。
Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache 指示请求或响应消息不能缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

应答消息举例:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Sat, 15 Jan 2005 15:36:26 GMT
Content-Length: 31401
Content-Type: text/html
Cache-control: private

省略内容

响应消息的第一行为下面的格式:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。
Status-Code是一个三个数字的结果代码。
Reason-Phrase给Status-Code提供一个简单的文本描述。
Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:
1xx : 信息响应类,表示接收到请求并且继续处理
2xx : 处理成功响应类,表示动作被成功接收、理解和接受
3xx : 重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx : 客户端错误,客户请求包含语法错误或者是不能正确执行
5xx : 服务端错误,服务器不能正确执行一个正确的请求

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信 息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、 Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

Location响应头
Location响应头用于重定向接收者到一个新URI地址。

Server响应头
Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。

实体
请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、Content-Length、Content-Location、 Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、 extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编 码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content -Range定义。

Content-Type实体头
Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型 Content-Range实体头

Content-Range实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

Content-Range: bytes-unit SP first-byte-pos -last-byte-pos/entity-legth
例如,传送头500个字节次字段的形式:Content-Range: bytes 0-499/1234 如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

Last-modified实体头
Last-modified实体头指定服务器上保存内容的最后修订时间。

如何获取这些信息呢?
有许多的工具可以获得这些信息,一方面可以使用脚本录制工具,比如WAS、LoadRunner、Jmeter等,但是他们都是必须通过浏览器来录制(针对web协议部分的)。另外还可以借助于网络拦截软件来检测HTTP协议的活动情况,我使用的是Visual Sniffer(是用于拦截通过网络传输的TCP/IP/UDP/ICMP等数据包的一个工具),它可以监测到通过本机的使用HTTP协议交互的数据。
例如:www-Authenticate: Basic realm=zxm.mgmt

不想说怎么使用了,因为只要把这个header头发送出去,那么就会有http给出相应响应的.如要看响应参数列表,请自行百度,google

header用用很方便

$flag = 0;
$argv = array(
"uid"=>"6c82b9f5m1f4d8eleb21",
"langx"=>"zh-tw",
"rtype"=>"r",
"mtype"=>"3",
"league_id"=>""
);

foreach ($argv as $key=>$value) {
if ($flag!=0) {
$params .= "&";
$flag = 1;
}
$params.= $key."="; $params.= urlencode($value);
$flag = 1;
}
$length = strlen($params);
$fp = fsockopen("www.fesite.com",80,$errno,$errstr,10) or exit($errstr."--->".$errno);
$header = "POST:/test.php HTTP/1.0 \r\n";
$header .= "Host:www.fesite.com \r\n";
$header .= "Referer: http://www.fesite.com/ \r\n"; //注意这里
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".$length."\r\n";
$header .= "Connection: Close\r\n\r\n";
$header .= $params."\r\n";
fputs($fp,$header);
$inheader = 1;
while (!feof($fp)) {
$line = fgets($fp,1024);
if ($inheader && ($line == "\n" || $line == "\r\n")) {
$inheader = 0;
}
if ($inheader == 0) {
$content.=$line;
}
}
echo $content;
fclose($fp);
?>

不想用zend加密PHP文件的方法,记住函数(eval)

PHP是免费的,大家号召开源
但我总不能把我的配置文档,我的账户密码给你是吧呵呵

zend的很强很暴力,这个大家都见识过了
而如果服务器我无权操作时,我要怎么保护我这仅有的权力呢

PHP自带的函数eval可以得用起来了

eval介绍:(喜欢用例子说话,请看吧)

例子1:
$a = 'echo md5("NeiLyi");';
eval($a);
?>

例子2:
$a = '$c = md5("NeiLyi");';
eval($a);
echo $c;
?>
以上两例解析:共同点,输出结果一致,都是输入一个NeiLyi字符串的md5值。
其中例子1表明,eval可以把其参数值中的php函数进行处理。
例子2是为了演示,其过程是可以定义变量并进行赋值的

明白了吧,只要把你想放到eval中的部份的东西,就可以作为PHP的命令进行执行。

所以,其它你要作的就是把一个PHP文件想法进行可反解密的加密过程,记得把

值得一提的是,这样作会损失你的PHP文件的执行速度,请自己权衡

PHP在windows系统下使用ssl,(AppServ一样)

如果想让你的PHP支持ssl,那么首先这个你得打开

extension=php_openssl.dll第二,把以下两个dll文件放到系统目录(system32)

1.libeay32.dll
2.ssleay32.dll
如果你用的是AppServ,那么直接就要php目录去搜索下

第三,当然不要忘记apache重启

很开心,已经成功使用gmail的stmp用PHP程序发送邮件

提醒:使用Gmail时,由于其是使用ssl,所以smtp应为:ssl://smtp.gmail.com,同时其端口不是25,至少我的邮箱端口是465

phpmailer使用指导

//导入类文件
require("class.phpmailer.php");

//声明类
$mail = new PHPMailer();

// 设置使用 SMTP
$mail->IsSMTP();

// 指定的 SMTP 服务器地址
$mail->Host = "smtp.neilyi.cn";

// 设置为安全验证方式
$mail->SMTPAuth = true;

// SMTP 发邮件人的用户名
$mail->Username = "webmaster@neilyi.cn";

// SMTP 密码
$mail->Password = "abscllll";

$mail->From = "webmaster@neilyi.cn";
$mail->FromName = "尼尔易";
$mail->AddAddress("admin@neilyi.cn");

//AddAddress函数格式为("收件地址","收件人")

//$mail->AddAddress("a@neilyi.cn","a人");
//$mail->AddAddress("b@neilyi.cn","b人"); // 可选

//可以回复的地址
//$mail->AddReplyTo("admin@neilyi.cn", "NeiLyi回复地址");


// 50字折行
$mail->WordWrap = 50;

// 加附件
//$mail->AddAttachment("/var/tmp/file.tar.gz");

// 附件,也可选加命名附件
//$mail->AddAttachment("/tmp/image.jpg", "new.jpg");

// 设置邮件格式为 HTML
$mail->IsHTML(true);

// 标题
$mail->Subject = "请迅速给我回邮件,好么";

// 内容
$mail->Body = '邮件内容为空';


// 附加内容
//$mail->AltBody = "This is the body in plain text for non-HTML mail clients";

//$mail->Send()为邮件发送函数,不成功时执行if内容
if(!$mail->Send())
{
echo "Message could not be sent.";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "Message has been sent";
详细请参照:点点过去