シミュレートされたログインについてよく質問されますが、実際、その原理は非常に簡単で、Web サイトから返されるヘッダー情報は特定の Web サイトに固有のものです。 。
ソースコード:
/*
* ウェブコンテンツを入手
* パラメータ: $host [in] 文字列
* ホスト名 (例: www.etoow.com)
* パラメータ: $method [in] 文字列
* 送信方法: POST、GET、HEAD... および対応するパラメーターを追加します (特定の構文については RFC1945、RFC2068 を参照)
* パラメータ: $str [in] 文字列
*投稿内容
* パラメータ: $sessid [in] 文字列
* PHP の SESSIONID
*
* @return Web ページのコンテンツ文字列
*/
関数 GetWebContent($host, $method, $str, $sessid = '')
{
$ip = gethostbyname($host);
$fp = fsockopen($ip, 80);
if (!$fp) return;
fputs($fp, "$methodrn");
fputs($fp, "ホスト: $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," ") // LINUX では " "
;
$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['コンテンツ'] = $entity;
fclose($fp);
$a を返します;
}
/* ユーザー名とパスワード文字列を構築します */
$str = ("ユーザー名=テスト&パスワード=テスト");
$response = GetWebContent("localhost","POST /login.php HTTP/1.0", $str);
echo $response['location'].$response['content']."
";
echo $response['sessid']."
";
if ( preg_match('/error.php/i',$response['location']))
{
echo "ログインに失敗しました
";
} その他 {
echo "ログインに成功しました
";
// sessidパラメータがないためUser.phpにアクセスできません
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', '');
echo $response['location']."
" // 結果: error.php?errcode=2
// user.php
にアクセスできます
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', $response['sessid']);
echo $response['location']."
" // 結果: user.php
}
?>