防刷票機制研究和.NET HttpRequest Proxy


最近應朋友之約 測試他做的投票網站 防刷票機制能力如何,下面有一些心得和體會。

朋友網站用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這行,技術是根本,但商業運作和思維方式也是非常重要的。一個程序員假如只會編程,那就是工程師。假如程序員學了經濟和管理,那也許就有機會成為袖珍版比爾蓋茨。

自己技術累積創造出自己的核心價值產品,然后商業運作進行市場化,這才是將價值轉化為價錢的道路吧。

自己也會走上這條路,技術上的累積和經濟行業商業化的認知。越往后搞技術的純粹性感覺就會越低,所以想告戒現在仍在努力的自己:

且行且珍惜


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM