快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

用PHP模仿登陆

  常常会有人问模仿登陆的问题,其实原理很简朴,只要把SessionID保存下来就可以了,今天花了一个小时的时间写了一个函数,供大家参考,网站返回的头信息,详细网站详细分析。

  源代码:

<?php
/* 
* 得到网页内容 
* 参数:$host [in] string
*      主机名称(例如: www.imsorry.com.cn
* 参数:$method [in] string
*      提交方式:POST, GET, HEAD ... 并加上相应的参数( 详细语法参见 RFC1945,RFC2068 )
* 参数:$str [in] string
*      提交的内容
* 参数:$sessid [in] string
*      PHP的SESSIONID
*
* @返回 网页内容 string
*/
function GetWebContent($host, $method, $str, $sessid = \\'\\')
{
    $ip = gethostbyname($host);
    $fp = fsockopen($ip, 80);
    if (!$fp) return;
    fputs($fp, "$methodrn");
    fputs($fp, "Host: $hostrn");
    if (!empty($sessid))
    {
        fputs($fp, "Cookie: PHPSESSID=$sessid; path=/;rn");
    }
    if ( substr(trim($method),0, 4) == "POST")
    {
        fputs($fp, "Content-Length: ". strlen($str) . "rn"); //  别忘了指定长度
    }
    fputs($fp, "Content-Type: application/x-www-form-urlencodedrnrn");
    if ( substr(trim($method),0, 4) == "POST")
    {
        fputs($fp, $str."rn");
    }
    while(!feof($fp))
    {
        $response .= fgets($fp, 1024);
    }
    $hlen = strpos($response,"rnrn"); // LINUX下是 "nn"
    $header = substr($response, 0, $hlen);
    $entity = substr($response, $hlen + 4);
    if ( preg_match(\\'/PHPSESSID=([0-9a-z]+);/i\\', $header, $matches))
    {
        $a[\\'sessid\\'] = $matches[1];
    }
    if ( preg_match(\\'/Location: ([0-9a-z_?=&#.]+)/i\\', $header, $matches))
    {
        $a[\\'location\\'] = $matches[1];
    }
    $a[\\'content\\'] = $entity;    
    fclose($fp);
    return $a;
}

/* 构造用户名,密码字符串 */
$str = ("username=test&password=test");
$response = GetWebContent("localhost","POST /login.php HTTP/1.0", $str);
echo $response[\\'location\\'].$response[\\'content\\']."<br>";
echo $response[\\'sessid\\']."<br>";
if ( preg_match(\\'/error.php/i\\',$response[\\'location\\']))
{
    echo "登陆失败<br>";
} else {
    echo "登陆成功<br>";
    // 不可以访问user.php,因为不带sessid参数
    $response = GetWebContent("localhost","GET /user.php HTTP/1.0", \\'\\', \\'\\');
    echo $response[\\'location\\']."<br>"; // 结果:error.php?errcode=2

    // 可以访问user.php
    $response = GetWebContent("localhost","GET /user.php HTTP/1.0", \\'\\', $response[\\'sessid\\']);
    echo $response[\\'location\\']."<br>"; // 结果:user.php
}
?>


返回类别: 教程
上一教程: 人大复印资料处理程序_补充篇
下一教程: PHP中date函数的选项说明

您可以阅读与"用PHP模仿登陆"相关的教程:
· 用PHP实现登陆验证码(类似条行码状)
· 用PHP实现登陆验证码(类似条行码状)
· “在phpMyAdmin使用用户口令登陆”补充
· 用PHP实现登陆验证码(类似条行码状)
· 在phpMyAdmin使用用户口令登陆
    微笑服务 优质保证 索取样品