php实现模拟登陆的原理讨论交流

zairwolft 2006-01-01 03:43:17
翻了很多资料,因为自己需要做个这样的程序,归纳了以下几点,请大家看看对不对。

由于通常网站对登陆的判断都是通过登陆程序产生的session和cookie实现的,所以实现方法基本上有两种:

1、获得cookie内容。通过php发送登陆部分的post给网站的登陆程序,然后分析返回内容,取出其中的cookie部分,在进行其他页面访问时将其作为变量加入,从而满足服务器上对登陆验证的判断。

2、获得sessionid。因为sid是php4对于不能保存cookie的浏览器的变相兼容处理方法,所以可以通过页面访问时带参sid来实现虚拟session连线。通过php发送登陆资料给服务器登陆程序,然后分析得到返回的phpsessid从而维持登陆。

目前已有的很多例子,里面的实现方法大体都是这样:fsockopen函数打开远程端口,fputs进行句柄内容写入,fgets得到返回内容,然后进行分析并继续其他操作。现有疑问如下:

1、打开远程端口用fopen为何不可?

2、看了一下http1.0协议(没找到详细的)。不明白fputs发出内容时POST和GET的区别,以及它们得到返回内容的区别。

3、传回内容中如果有cookie的话,格式是“换行Set-Cookie:xx换行”。如果是sessionid的话,格式是“换行PHPSESSID=xx;换行”。对否?

4、如果上述两种虚拟登陆方法正确的话,似乎虚拟的后续使用上用phpsessid比cookie要方便?

5、在尝试用fputs($f,$cmd);的方式送入$cmd="\r\nGET test4.php HTTP/1.0\r\n\r\n"的时候,提示错误:
------------------------------
Bad Request
Your browser sent a request that this server could not understand.
Invalid URI in request GET test4.php HTTP/1.0

HTTP/1.1 400 Bad Request Date: Sat, 31 Dec 2005 19:40:07 GMT Server: Apache/1.3.33 (Unix) Resin/2.1.14 mod_throttle/3.1.2 mod_ssl/2.8.22 OpenSSL/0.9.7d Connection: close Content-Type: text/html; charset=iso-8859-1
------------------------------
如上
...全文
956 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
web_php 2006-01-05
  • 打赏
  • 举报
回复
学习中......
zairwolfo 2006-01-05
  • 打赏
  • 举报
回复
糊涂了。这么说吧,我想用php来实现登陆www.cmfu.com这个网站。怎么实现?
zairwolfo 2006-01-05
  • 打赏
  • 举报
回复
楼上这种方法是普通的post方法,通不过对refer有限制的程序。
wjjchen 2006-01-05
  • 打赏
  • 举报
回复

<?php
// simple post method
// version 1.0 by Andrus (andrus@vnet.ee)

// Disclaimer:
// everyone can change or use this code however and wherever they want ;)

// NB! For posting to Microsoft platform webservers you may need to change newlines "\r\n" to "\r\r\n"
// Microsoft always breaks standards ...

// send out "browser" headers
function send_headers ($fp) {
fputs ($fp, "Accept: */*\r\n");
//fputs ($fp, "Accept-Language: en\r\n");
fputs ($fp, "Connection: Keep-Alive\r\n");
fputs ($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n");
}

// post data and return reply
function post_data ($host, $url, $data) {
$fp = @fsockopen ($host, 80, $errno, $errstr, 120);
$ret = "";
if (strncasecmp ($url, "http://", 7) == 0) $url = substr ($url, 7);
$p = strpos ($url, '/');
if ($p==="") {
$req = "/";
} else {
$req = substr ($url, $p);
}
if ($fp) {
fputs ($fp, "POST $req HTTP/1.0\r\n");
send_headers ($fp);
fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n");
$out = "";
while (list ($k, $v) = each ($data)) {
if(strlen($out) != 0) $out .= "&";
$out .= rawurlencode($k). "=" .rawurlencode($v);
}
$out = trim ($out);
fputs ($fp, "Content-length: ".strlen($out)."\r\n\r\n");
fputs ($fp, "$out");
fputs ($fp, "\r\n");
while(!feof($fp)){
$ret .= fgets($fp);
}
fclose ($fp);
}
return $ret;
}
// example how to use:

// following code will post variables "login" and "pass" to server "www.something.om" script "/submit.php"
$reply = post_data ("www.ecool2004.com", "/vote.asp", array ("Options" => "6"));
echo $reply;
?>
ice_berg16 2006-01-04
  • 打赏
  • 举报
回复
一样的啊,HTTP协议就是这样的
zairwolft 2006-01-04
  • 打赏
  • 举报
回复
rt
zairwolft 2006-01-03
  • 打赏
  • 举报
回复
这样是给客户端发送的吧。不是模拟的服务器对服务器发送的吧。
mrshelly 2006-01-03
  • 打赏
  • 举报
回复
header("Referer: http://.......");
zairwolft 2006-01-03
  • 打赏
  • 举报
回复
对于一些禁止站外提交数据的网站,怎样伪造来源?
mrshelly 2006-01-02
  • 打赏
  • 举报
回复
GET /test4.php

建议多看看HTTP协议的内容。
zairwolft 2006-01-02
  • 打赏
  • 举报
回复
rt
ice_berg16 2006-01-02
  • 打赏
  • 举报
回复
这个问题很好解决,
先下载一个http sniffer ,启动监视
打开要进行登陆操作的网站,然后实际操作一下,操作结束后,打开sniffer看一下
浏览器和server之间发送的原始数据,再用php模拟浏览器照原样发送即可。

这种情况还是使用一个httpClient类来处理比较方便一些。
thunderx 2006-01-02
  • 打赏
  • 举报
回复
呵呵,看看HTTP协议吧
http://www.cnpaf.net/class/http/
zairwolft 2006-01-02
  • 打赏
  • 举报
回复
我加上/试过的,一样无效。

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧