javascript - 關於一個投票系統的問題,如何防止刷票

來源:互聯網
上載者:User
像驗證手機號的代價太大,咱就不說了;像驗證碼這樣的,如何設定最好;還有沒有其他更加有效方式?

回複內容:

像驗證手機號的代價太大,咱就不說了;像驗證碼這樣的,如何設定最好;還有沒有其他更加有效方式?

我就直說吧:放棄你的幻想。沒有任何方式是必然有效。

一切防刷的努力都能被破解,只要肯花錢。以我接觸過的一些價格舉例:

  • 識別裝置的特徵:這個畢竟是用戶端上報的資料,所以隨便偽造,無需花錢

  • 電子郵箱:這個幾乎是免費的

  • QQ號:信封號洗號後直售。0.15--0.50元/個不等

  • :號池養號出租。0.50--3.00元/個不等

  • IP:肉雞池或Proxy 伺服器叢集出租。0.50--10.00元/時不等

  • 簡訊接收驗證:貓池養卡代收。0.05--0.30元/次不等 另外唯有這個同時消耗防守方的資金

  • 簡訊發送驗證:貓池養卡代發。0.20--0.80元/次不等

  • 傳統驗證碼:Image Recognition。0.10--0.30元/個不等

  • 複雜驗證碼:人工打號。0.20--0.80元/個不等(這個一般作為Image Recognition失敗時的補充)

  • 同時還有自動點擊指令碼的定製服務,100--3000元/每套不等,可能要配合使用上邊的資源作為消耗品。

(注意:黑產的價格都是模糊、飄忽且各地極其分散的,難有默契或者“行情”。根據個人接觸的圈子不同,具體價格不盡準確。)

不要低估互連網黑產這門行業——它遠遠超出我們一般技術人的想象。

防刷不能靠一門單一的技術,而是要綜合分析可能的破解手段,評估攻擊者願意做到什麼地步,以和黑產打一場全面戰爭的角度思考問題。即:如何以最小的消耗,來最大限度的浪費黑產的時間和金錢

而這種問題必然是沒有銀彈的。所有只提出一種單一手段的答案都該被踩——“技術解決一切”對於某些場合,是一種過於幼稚的幻想,得讓現實需求好好削幾個耳光治一治。

從這個意義上,單純的提問這個問題,資訊量太少了。具體策略必然需要根據具體的情境而定。例如:

  • 活動做多大規模?

  • 活動有多大利益?

  • 能否估計出可能的攻擊者,會投入多大量級的資金?

  • 預計投入多少資金用於防刷技術?

  • 無論如何防刷,刷單損失客觀上仍不可避免。那麼最高可以容忍多少個百分點?

一般而言,以下的幾種方法是比較划算的(即破解這些需要相對多的時間和金錢):

  • IP限制

  • 驗證

  • 複雜驗證碼

  • 簡訊接收

刷票行為,一直以來都是個難題,無法從根本上防止。

但是我們可以盡量減少刷票的傷害,比如:通過人為增加的邏輯限制。

基於 PHP,下面介紹防刷票的一些技巧:文章連結

1、使用CURL進行資訊偽造

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));curl_setopt($ch, CURLOPT_REFERER, "http://localhost/ ");curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.0)");$out = curl_exec($ch); curl_close($ch);

2、驗證碼:採用非常複雜的驗證碼

確切的說驗證碼的出現不是針對於人,而是針對於機器。通過複雜度和識別難易度的控制來阻攔掉一部分刷票機,從而減少刷票的發生。但隨著軟體技術、識別技術的發展越來越多的驗證碼面對著先進的刷票軟體也失去了其防範的作用、但是專業刷票機可以攻破。如果不用驗證碼,投票基本就歇菜了,驗證碼擷取方式,採用非同步載入,即點擊輸入框時,才去請求,投票成功後,刪除驗證碼的 Session

3、限時投票

比如:從早8點至晚23 點

4、設定投票間隔

使用者投票後,需要隔多長時間才能繼續投。
很多投票網站基本上都有這個限制,但是對於更改 IP的攻擊,就沒辦法了

5、投票結果展示:延遲展示,友好展示

頁面上投票,JS 立馬加1,但是重新整理頁面,不一定立馬展示最新投票結果,返回狀態給頁面(感謝您的投票!或者 投票成功!至於有沒有成功,另說了!)

6、扣量邏輯:常見於一些軟體評選之類的投票

這是個殺手鐧,後台跑指令碼即時監控異常增長(刷票)的項,然後實施扣量邏輯
即對於這個項,投 10 票才算一票

7、Cookie:常用的手段。比較低級

投票後,在用戶端寫入 Cookie,下次投票時判斷 Cookie 是否存在
但是,這種方式非常容易攻破,因為 Cookie 可刪除

8、加密選項 ID:對一些投票選項的ID,進行隨機加密

密碼編譯演算法,加Salt,並且設定有效時間,比如5分鐘內
伺服器端進行解密並且驗證

9、nginx限制連結數

ngx_http_limit_conn_modulengx_http_limit_req_modulenginx_limit_speed_module

可以使用這三個模組來限制,不過這不是一個好的解決方案

10、iptables限制

/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT/sbin/iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT

具體指令碼

#!/bin/bash# Date: 2015-09-29# # Author: cpz@erongtu.com shopt -s -o nounsetexport PATH=/usr/bin/:/bin iptables_log="/tmp/iptables_conf.log" /sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT/sbin/iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT while [ true ]; do     #sleep 1    for IP in `netstat -an | grep -i ':80 '|grep 'ESTAB' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 30 && $2!="127.0.0.1" ) {print $2}}'`    do        /sbin/iptables -L -n  | grep  $IP >/dev/null || /sbin/iptables -A INPUT -p tcp --dport 80 -s $IP -j DROP        echo "/sbin/iptables -A INPUT -p tcp  -s $IP -j DROP" >> ${iptables_log}    donedone

做裡不錯,用jssdk擷取使用者的openid,就可以了

如果沒有帳號體系, 那麼防止刷票要通過ip來判斷,
擷取ip得用$_server[remote_addr]來擷取使用者ip。

人類已經無法阻止刷票行為了。。現在的人刷票都是加群,各種刷票群,然後各種人互刷。。

我覺得這不是個技術問題,應該是個產品管理的問題。純技術手段必須要結合你對這個“投票”的產品的經營策略才能發揮最大效用。就像剛才有人說的,如果你只是把這個產品定義成一個只能完成簡單survey功能的(只有幾個記錄選項然後upload再匯總的功能)簡單產品,那你就要添加許許多多的技術手段來保證你這個產品實現你的預期功能(確實反映客觀投票結果)。但是如果你提前在設計產品的時候,以結果為導向,把這一塊考慮進去,那麼你就應該考慮到對使用者的過濾是此產品很關鍵的一環,而不至於等到先把投票功能開發完了,再回過頭去考慮“防刷票”,這是本末倒置,說明產品設計流程有問題。

如果你能解決上面我說的問題,就應該一開始就想到,要先過濾使用者,再讓過濾出來的使用者“幹什麼”(不管是投票還是評論還是別的什麼)。所以應該先搞一個準入制度,比如註冊,驗證,答題啟用,推薦啟用,間隔日期啟用,積分功能啟用許可權等等手段來盡量拔高門檻,然後再考慮利用這批過濾出來的使用者來做什麼。這樣才是解決這個問題的正確思考順序。

禁止代理,然後用IP限制+複雜驗證碼限制,對於一般的投票是沒問題的。

投一票支付10元就可以了

帳號登入投票,一個帳號只能投一次,這樣就是不太方便了,得先弄個帳號登入。。。

知己知彼,百戰百勝

首先弄清使用者為啥要刷,刷票對他有啥好處

我們當然會給刷票者設立門檻,但是只要刷票帶來的收益大於付出的成本,就會存在刷票的可能性(墨菲定律)。

所以不存在完美的防止刷票的機制,而是根據具體的投票內容設定合適的投票成本。

現在刷票牛逼的都用人來搞了。我曾經做過投票系統,記錄了投票者的IP,然後我發現有很多處於同一網段的地址,後來我查了下這些IP的歸屬地,發現都是外地的,最後我就把這種連續IP地址的投票保留一票,其他的都刪掉。

我來說說驗證碼。
如果你要設定驗證碼,請遵循以下幾點。 一般這種驗證碼出現,我就搞不定了。

  1. 字元之間隨機互相串連. 加大切分痛點。

  2. 字元隨機扭曲. 配合串連把切分難度增加一個指數。

  3. 隨機旋轉. 本身沒有增加識別難度,不過配合上面2項增加了切分難度

  4. 單一顏色. 不要搞多種顏色, 單一顏色反而更難切分。

  5. 隨機中文。 相比於英文,如果配合以上幾項,基本上切分已經變成一件很困難的事情,如果真的要破成本會很高。

PS: 還有其他一些可以增加難度的事情, 不過以上本身已經會讓人眼識別成功率不超過50%了, 再加已經沒有太大意義。PS 第5項目 換成英文會提高人眼識別和機器識別的成功率。具體自己可以嘗試。

這個確實不容易,假投票主要來自於:

  1. 機器人:這個基本還是需要靠驗證碼。機器難以識別的驗證碼人也不容易識別,但似乎也沒有更好的辦法。
    2.水軍:這個需要分析使用者行為,把水軍帳號找出來

這個真沒辦法,做過第一名只有300塊的獎金,結果刷票就有幾千票了,按一個0.5計算,刷票成本都高過獎金價值了

現在還可以用 flashcookie ,對普通使用者來說很難清除,可以做記錄裝置id用,對於一些專業的人,就不用考慮屏蔽了,如果有人搞你,是躲不掉的。

應該不會有人專門為了你這次投票而製作一個刷票機,那樣的話成本會比較高的。

我也覺得,要想完全防止刷票,是不可能的,我們能做的,只是盡量增加刷票方的成本,從而讓他的付出大於刷票得到的成果,他自然而然就退卻了!
除了ip、複雜驗證碼這些,我倒是比較推崇使用者行為作為判斷是否刷票的依據,再結合上面大家說的這些,能增加刷票的難度。
比如通過記錄使用者進入網站的過程,捲軸滾動到什麼位置,滑鼠在什麼地方懸停多久,滑鼠在什麼地點擊過,有無瀏覽其他頁面,其他頁面滑鼠和捲軸的動作,都記錄下來,判斷符合正常人為投票的邏輯才能在票數上加1.

個人認為,圖片式驗證碼的防刷就是預防圖形識別軟體,感覺360刷票的認證登陸方式不錯,就是給定一個名詞,如:吉他,讓登陸者點擊選擇圖中所有的吉他,相信這種方式目前沒有破解的途徑,畢竟這裡需要人工智慧分析,至於有沒有這樣的開源庫就得自己找了。

裝置唯一ID 能得到就ok了~

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.