在 PHP 開發中,若要模擬使用者登入第三方網站,cURL 函式庫是不可或缺的工具。它能讓伺服器端程式碼像真實瀏覽器一樣發送 HTTP 請求、攜帶 Cookie、處理重導向,從而實現自動化登入與操作。本文將詳細拆解如何繞過新浪微博複雜的加密登入機制,改用新浪通行證(Sina SSO)的明文密碼登入介面,並完成微博發布的全流程。
新浪微博官方登入介面 login.sina.com.cn 採用了 sha1(sha1(sha1(pwd)).once.servertime) 這類多層雜湊加密,導致直接模擬極其困難。但作者發現一個關鍵突破口:微博帳號可通用於所有新浪產品。新浪郵箱、通行證等子站點的登入介面並未強制要求同等強度的加密,甚至存在明文傳輸密碼的舊版介面。
這屬於資安領域的「旁路攻擊」思路:當主目標防禦過於堅固時,尋找同一信任體系下防禦較弱的關聯系統作為突破口,拿到登入憑證後再回頭存取目標系統。
目標 URL:https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543
關鍵參數說明:
su:使用者名稱經 Base64 編碼sp:密碼(此介面接受明文)entry=sso、service=sso:標識單點登入模式returntype=TEXT:要求返回純文字 JSON 而非 JavaScript 回調<?php
$username = base64_encode($u);
$password = $p; // 明文密碼
$loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543';
$loginData = [
'entry' => 'sso',
'gateway' => '1',
'from' => 'null',
'savestate' => '30',
'useticket' => '0',
'pagerefer' => '',
'vsnf' => '1',
'su' => $username,
'service' => 'sso',
'sp' => $password,
'sr' => '1920*1080',
'encoding' => 'UTF-8',
'cdult' => '3',
'domain' => 'sina.com.cn',
'prelt' => '0',
'returntype' => 'TEXT',
];
$login = json_decode(loginPost($loginUrl, $loginData), true);
var_dump($login);
function loginPost($url, $data) {
global $cookie_file;
$post = is_array($data) ? http_build_query($data) : $data;
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post,
CURLOPT_COOKIEJAR => $cookie_file,
CURLOPT_COOKIEFILE => $cookie_file,
]);
$return = curl_exec($ch);
curl_close($ch);
return $return;
}
?>
成功時返回 JSON 範例:
array(4) {
'retcode' => '0'
'uid' => '1920109964'
'nick' => '畢姥爺講故事'
'crossDomainUrlList' => array(2) {
[0] => 'https://passport.weibo.com/wbsso/login?ticket=ST-...'
[1] => 'https://crosdom.weicaifu.com/sso/crosdom?action=login&savestate=...'
}
}
登入成功後,crossDomainUrlList 中的 URL 必須逐一請求,以便在 weibo.com、weicaifu.com 等域名下寫入 Cookie。務必在訪問 weibo.com 首頁之前完成此步驟,否則會因缺少跨域 Cookie 而導致未登入狀態。
<?php
// 依序請求跨域同步 URL
foreach ($login['crossDomainUrlList'] as $syncUrl) {
get($syncUrl); // 使用同樣攜帶 Cookie 的 GET 請求函式
}
?>
直接請求 https://weibo.com,伺服器會根據 Cookie 自動重導向到用戶的個人首頁(如 https://weibo.com/bipeng0405/home?wvr=5)。記錄 curl_getinfo 返回的 redirect_url 即可得到目標地址。
<?php
$ch = curl_init('https://weibo.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_COOKIEFILE => $cookie_file,
CURLOPT_COOKIEJAR => $cookie_file,
CURLOPT_FOLLOWLOCATION => 1, // 自動跟隨重導向
]);
$return = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
// $info['redirect_url'] 即為個人首頁真實地址
?>
拿到個人首頁 URL 與完整 Cookie 後,即可分析發布微博的 AJAX 介面(通常為 https://weibo.com/aj/mblog/add),提取 _t、_spr 等防 CSRF Token,組裝 content、pic_id 等參數發送 POST 請求即可完成發布。完整代碼篇幅較長,核心邏輯與上述登入流程一致:維持 Cookie 會話、模擬瀏覽器 Header、處理 JSON 回應。
