最近做了一個投票,需要做防刷票措施。但是刷票很難防止,畢竟手段也多。為了最大程度上阻止刷票行為,就用了這麼一個方法。
首先在前台頁面定義一個字串'www.bkjia.com',然後使用discuz的 authcode 函數,產生一串密文。這串密文每次都不一樣,比如會產生
- 10884NwIMCg5nDZ24rarNv+nBpsWut6ReT1grxHH4oKSdvgPmXJ0z2jEuePCe
- a8b4XU3yBHEec48KirVf0N3VAXKIQHm1qvwvpCYUu6ywwQJLR0ErlI1zwfG7tQ
但是在後台經過解碼,回複的明文最後都會變回'www.bkjia.com',利用這點,我們可以在伺服器端判斷,若返回的密文解碼後不是那個字串,則無法投票。
discuz的 authcode 函數可以說對中國的PHP界作出了重大貢獻。包括康盛自己的產品,以及大部分中國使用PHP的公司都用這個函數進行加密,authcode 是使用異或運算進行加密和解密。
原理如下,假如:
加密
- 明文:1010 1001
- 密匙:1110 0011
- 密文:0100 1010
得出密文0100 1010,解密之需和密匙異或下就可以了
解密
- 密文:0100 1010
- 密匙:1110 0011
- 明文:1010 1001
並沒有什麼高深的演算法,密匙重要性很高,所以,關鍵在於怎麼產生密匙。那我們一起看下康盛的authcode怎麼做的吧:
0 驗證資料有效性 // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 驗證資料完整性 // 驗證資料有效性,請看未加密明文的格式 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { // 把動態密匙儲存在密文裡,這也是為什麼同樣的明文,生產不同密文後能解密的原因 // 因為加密後的密文可能是一些特殊字元,複製過程可能會丟失,所以用base64編碼 return $keyc.str_replace('=', '', base64_encode($result)); }}// 加密echo authcode("www.bkjia.com", 'ENCODE');// 解密echo authcode(authcode("www.bkjia.com", 'ENCODE'));//echo authcode("55e5OxJ5zjgFuqTjFRPdt9ag+fC+GKP9Efq6yWeAAvdQFq+D");?>
http://www.bkjia.com/PHPjc/752395.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/752395.htmlTechArticle最近做了一個投票,需要做防刷票措施。但是刷票很難防止,畢竟手段也多。為了最大程度上阻止刷票行為,就用了這麼一個方法。 首先在...