受友人委託測試其 PHP 投票網站的防刷票能力。網站初期僅採 IP 限制,極易被突破。本文記錄從收集免費代理 IP、分析 HTTP 請求到模擬刷票的完整過程,並探討對應防禦策略。
搜尋「免費代理 IP」可獲得大量公開代理清單,依格式儲存為文字檔(IP:Port),供後續輪詢使用。
使用 Fiddler 攔截正常投票操作,分析 HTTP Request Header 與 Body,確認必要參數(如表單欄位、Cookie、Referer 等)。
public class VoteBot
{
private readonly List<string> _proxies;
private int _proxyIndex = 0;
public VoteBot(string proxyListPath)
{
_proxies = File.ReadAllLines(proxyListPath)
.Where(l => !string.IsNullOrWhiteSpace(l))
.ToList();
}
public async Task<bool> VoteAsync(string voteUrl, Dictionary<string, string> formData)
{
var proxy = GetNextProxy();
var handler = new HttpClientHandler
{
Proxy = new WebProxy(proxy),
UseProxy = true,
CookieContainer = new CookieContainer()
};
using (var client = new HttpClient(handler))
{
// 模擬瀏覽器 Header
client.DefaultRequestHeaders.Add("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)...");
client.DefaultRequestHeaders.Referrer = new Uri(voteUrl);
var content = new FormUrlEncodedContent(formData);
var response = await client.PostAsync(voteUrl, content);
return response.IsSuccessStatusCode;
}
}
private string GetNextProxy()
{
if (_proxies.Count == 0) throw new InvalidOperationException("無可用代理");
var proxy = _proxies[_proxyIndex];
_proxyIndex = (_proxyIndex + 1) % _proxies.Count;
return proxy;
}
}
| 防禦層級 | 典型做法 | 攻擊繞過 |
|---|---|---|
| IP 限制 | 同 IP 限投一次/天 | 代理 IP 池輪換 |
| Cookie/Session | 驗證 Cookie 有效性 | 模擬登入獲取 Cookie,或攜帶固定 Cookie |
| 驗證碼 | 圖形/滑塊/點選驗證碼 | OCR 識別、第三方打碼平台、滑塊軌跡模擬 |
| 裝置指紋 | Canvas、User-Agent、字型列表等 | Headless Chrome + 指紋偽裝腳本 |
| 行為分析 | 點擊頻率、停留時間、鼠標軌跡 | 隨機延遲、模擬人類操作軌跡 |
| 帳號綁定 | 需登入/手機驗證才能投票 | 批量註冊/接碼平台/賬號採購 |
單一防禦手段極易被突破,唯有構建「前端阻擋 + 傳輸驗證 + 業務風控 + 數據審計」的立體防禦體系,並持續更新規則庫、引入機器學習異常檢測,才能有效提升刷票成本,守護投票公平性。