最近應朋友之約 測試他做的投票網站 防刷票機制能力如何,下面有一些心得和體會。
朋友網站用PHP寫的,走的是HttpRequest,他一開始認為IP認證應該就差不多了。但說實話這種很low,手動更換代理服務器手動刷都可以。但程序員的手就是程序,於是,
首先先 百度到 一些 免費代理服務器,非常多網站分享這些。按一定格式來儲存到TXT文件。

第二步使用Fiddler來進行截取消息,拿到其http request header和body:

第三步使用.NET HTTPREQUEST。邏輯是遍歷代理txt里代理,偽造 fiddler監聽到的request 消息(當然其中一些cookie和其他的細節需要改變根據不同情況討論)
_contentsList = File.ReadAllLines(@"C:\Proxy.txt");
var contents = _contentsList.ToList();
var proxy = string.Empty;
var port = 0;
foreach (var item in contents)
{
new Thread(() =>
{
try
{
// 獲取代理
var list = item.Split(':');
proxy = list[0];
port = Convert.ToInt32(list[1]);
// 偽造消息
var request =
(HttpWebRequest)
WebRequest.Create(
@"http://XXX.COM");
request.Proxy = new WebProxy(proxy, port);
request.UserAgent = @"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0";
request.Referer = @"http://XXX.COM";
request.Method = "GET";
request.Host = @"XXX.COM";
request.Accept = @"*/*";
request.Headers.Add(@"Accept-Language", @"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
request.Headers.Add(@"Accept-Encoding", @"gzip, deflate");
request.Headers.Add(@"X-Requested-With", @"XMLHttpRequest");
var response = request.GetResponse();
Console.WriteLine(response.ToString());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
).Start();
然后我朋友發現這樣的確問題很大,於是他采用了驗證碼驗證模式,即首先服務器會發給你驗證碼,你發的request的uri里參數必須要包含相同的驗證碼。
這種方式非常好,至少干掉了絕大多數的刷票軟件。但我仍然想試驗一下,這有一種battle的味道。哈哈
其實這個邏輯來說就是一來一回。給我驗證碼圖片,我識別出來,然后再發送就好了。難度就在於驗證碼的OCR。
一開始我朋友驗證碼非常簡單,就是幾個數字,於是我直接使用最基礎的OCR識別就干掉了。
后來他加了噪點,OK,這個也沒有問題。我們降噪,然后再識別,雖然機器學習需要一段時間,但正確率還是有一些的。
最后他采用了隨機產生漢字,我發現,漢字的OCR是個很麻煩的事情。這也是我下一步要研究的點,以后會出一篇關於OCR的文章。
隨后他說還會加入一些cookie驗證什么的,到這里我覺得我朋友的網站現在算是挺完善了。然后我就問下我老大,如果是他,他會怎么來刷票。
我老大回復非常簡單,租人人工刷,隨你技術怎樣,我給他們兩毛一票,你算算時間成本,完全划得來。
雖然這可能就是他隨口一說,但我有一些感悟。
在IT這行,技術是根本,但商業運作和思維方式也是非常重要的。一個程序員假如只會編程,那就是工程師。假如程序員學了經濟和管理,那也許就有機會成為袖珍版比爾蓋茨。
自己技術累積創造出自己的核心價值產品,然后商業運作進行市場化,這才是將價值轉化為價錢的道路吧。
自己也會走上這條路,技術上的累積和經濟行業商業化的認知。越往后搞技術的純粹性感覺就會越低,所以想告戒現在仍在努力的自己:
且行且珍惜
