在網路上,我們經常看到各種各樣的投票,五花八門,今天我們一起來看一看大廠做的網路投票,有需要的小夥伴可以參考一下。
今天看酷正巧看到酷牛人--我是傳奇的網路投票,很好奇這些牛逼的大公司是怎麼做網路投票的,特此分析一下優酷是怎麼做網路投票。
正文:
優酷牛人--我是傳奇的網路投票頁面:http://c.youku.com/niuren
自己隨便選一個選手,會彈出一個播放的浮動層,上面的投票按鈕,點擊投票成功後,
再次投票,為提示你:你已經投過,請一個小時後在投票! -----看起來這個投票很正常,但是這些都是表面現象。
使用firebug我們可以發現,每次投票都會觸發一個http請求,
我們可以把這個http的連結:
# http://minisite.youku.com/pub2/i_am_legend/vote.php?id=XMjc1NzExMzE2&callback=c&i=0.19621988418141467
我的第一感覺這個是使用getjson方式做的投票,我們把這個放在瀏覽器裡,刷新幾次發現資料一直是增加的
,,689票,這樣就可以刷票? ?
帶著好奇我打開頁面發現這個選手的票數情況:
#我擦,我第一感覺這個怎麼跟我平時做的投票很類似啊,趕緊找列表頁的ajax請求文件;
果然發現是:
http://minisite.youku.com/pub2/i_am_legend/getvote.php?page=1&callback= cc&count=8&i=0.42276474971249034
這是一個很典型的jquery裡面的getjson方式回傳的資料
#(我使用的jquery框架,酷不是用jq框架,但原來類似),我又找了一個這個請求的源碼:
function vTpListGet(pg, pz, t){ pg = (pg || 1); pz = (pz || 8); t = (t || false); cc = function(oList, total){ if(oList.length > 0){ var html = ""; for(var i=0;i < oList.length;i++){ html += "<ul class=\"x\">\n"; html += " <li class=\"x_thumb\"><a href=\"javascript:;\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\" title=\""+oList[i].title+"\"><img src=\""+oList[i].thumburl+"\" alt=\""+oList[i].title+"\" /></a></li>\n"; html += " <li class=\"x_title\"><a href=\"javascript:;\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\" title=\""+oList[i].title+"\">"+oList[i].title+"</a></li>\n"; html += " <li class=\"x_data\">票数:<span class=\"num\">"+oList[i].total+"</span></li>\n"; html += " <li class=\"x_btn\"><span class=\"btn\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\"></span></li>\n"; html += "</ul>\n"; } html += "<p class=\"clear\"></p>"; //alert(html); document.getElementById('videosTpList').innerHTML = html; if(t){ //显示分页 max_cnt = pz; var js_pager = new jsPager(); js_pager.init(total, pz, pg, "vTpPager"); document.getElementById('videosTpPager').style.display = ""; document.getElementById('videosTpPager').innerHTML = js_pager.getHtml(); } } }; js_request("http://minisite.youku.com/pub2/i_am_legend/getvote.php?page="+pg+"&callback=cc&count="+pz+"&i=" + Math.random()); }
再來看優酷關於限制頻繁投票的方法:
function vTp(vid){ c = function(num,vid){ alert("投票成功,目前票数为:"+num+"票!"); var exp = new Date (); exp.setTime(exp.getTime() + 3600000); setCookie("nrtp", "true", exp); } if(getCookie("nrtp") != "true"){ js_request("http://minisite.youku.com/pub2/i_am_legend/vote.php?id="+vid+"&callback=c&i=" + Math.random()); }else{ alert("一小时内只能投票一次!"); return false; } }
竟然是在客戶端寫cookies來判斷,不禁有點坑爹了,之前我們做網路投票經常被刷票,但是畢竟我們在使用服務端驗證,記錄一下ip來限制,但是優酷這個投票完全是靠客戶端驗證來實現。
總結一下優酷的投票:
列表頁的數據是即時顯示的,也就是說投票後立刻顯示----我們當年投票也是即時顯示,但是伺服器壓力太大,越到刷票的,資料庫被頻繁的插入讀取,對數據壓力也是蠻大的,經常把資料庫伺服器宕機了,後來採用快取機制也解決這個問題,一分鐘後顯示數據。
這個投票的api文件寫的有問題,我把http://minisite.youku.com/pub2/i_am_legend/vote.php?id=XMjc1NzExMzE2&callback=c&i=0.19621988418141467在瀏覽器,不停的刷新居然可以不停的增加票數,很顯然優酷的程式設計師偷懶了,起碼也要判斷一些提交頁面的路徑啊,提交方式啊的什麼,判斷我是否來自正常的投票請求,如果這樣的話這個投票也太容易刷票了,直接把這個url放在瀏覽器不同的F5就可以了,實在不行直接寫個js定時刷新頁面也可以。
防止刷票機制,決然是使用客戶端cookie做驗證,這個就有點菜鳥了,最普通的方式也是根據ip做驗證(雖然這個方式在專業刷票公司哪裡也是小兒科,但是應付非專業人士還是足夠了),防止頻繁刷票。
總結;
有點失望了,以為大公司的技術都比我們成熟,看來有點高估了吧,看來不要盲目的迷戀和崇拜大公司,做好自己,相信自己的才是關鍵!
推薦學習:php影片教學
以上是大廠是如何做網路投票的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6
視覺化網頁開發工具