文章來自於:PHP自學中心
大部分產品都會涉及到簡訊驗證碼的使用介面,尤其是手機產品,簡訊驗證碼幾乎已經成為所有手機產品的標準。因此,防止簡訊被刷成了每個產品經理和開發人員關心的問題。
沒有體驗過簡訊被刷問題的產品經理可能不會太注意這個問題。在這篇文章中,我將簡要介紹黑色工具的簡訊轟炸機。簡訊轟炸機是一個軟體,使用書面程式刷簡訊大量。它可以自動批量提交手機號碼,模擬IP等方式刷簡訊。
因此,在設計需要使用簡訊驗證碼的產品時,必須制定限制規則,避免簡訊被閃現。
在PC時代,大多數平臺通過圖形驗證碼的形式降低了被機器刷過的風險。最典型的例子是12306“奇妙的驗證碼”。然而,在移動網際網路時代,使用者體驗非常重要,有時使用圖形驗證碼會對使用者體驗產生一定的影響。那麼,除了圖形驗證碼的方式外,還有什麼方法可以解決簡訊被刷的問題呢?
提供了幾種方案僅供參考:思路都在,程式碼就容易實現咯
1、時間限制:60秒後才能再次傳送從傳送驗證碼開始,前端(客戶端)將執行60秒的倒計時。 在這一分鐘之內,使用者無法提交多個傳送資訊的請求。 儘管通常使用此方法,但它不是很有用。 技術更好的人可以繞過此限制,直接傳送簡訊驗證碼。
程式碼如下:
//檢查是否相隔60秒後傳送$limitKey = "mobile_sms_send_limit:" . $mobile;$smsSendLimit = Yii::app()->redis->get($limitKey);if ($smsSendLimit) { $this->_end(1, '60秒後才能重新發送簡訊驗證碼!');}2、手機號限制:同一個手機號,24小時之內不能夠超過5條
使用相同的手機號碼註冊或傳送SMS驗證碼的其他操作時,系統可以限制手機號碼。 例如,在24小時內只能傳送5個簡訊驗證碼。 如果超出限制,則會報告錯誤(例如:忙,請稍後再試)。 但是,這隻能避免手動刷簡訊。 對於使用不同手機號碼批量傳送簡訊的計算機,此方法無助。
程式碼如下:
/檢查傳送次數$key = "mobile_sms_send_times:" . $mobile . ":" . date("YmdHis");$smsSendTimes = Yii::app()->redis->get($key);if (empty($smsSendTimes)) { $smsSendTimes = 0;} else if ($smsSendTimes >= 5) { $this->_end(1, '每個手機號每天最多能發5條簡訊!');}3、簡訊驗證碼限制:30分鐘之內傳送同一個驗證碼
網上還有另一種方法:30分鐘內,傳送的所有簡訊驗證碼都是相同的驗證碼。 第一次請求SMS介面,然後快取簡訊驗證碼結果。 如果您在30分鐘內再次請求,您將直接返回快取的內容。 對於此方法,尚不清楚簡訊介面提供程式是否會為傳送快取的資訊收取費用。 如果您有興趣,可以了解一下。
部分程式碼如下
<?php//這裡判斷是否存在簡訊快取if(Cache::get('codeCache') != null){\t//簡訊30分鐘記憶體在,則繼續發同一條簡訊給使用者\t$code = Cache::get('codeCache');\t//接下來把code發給使用者的業務操作\t。。。\t}else{\t//接收簡訊驗證碼\t$code = $this->smsTplTrait() //假如這裡作為接收到簡訊"562334"\t//將接收到的code存在Cache裡30分鐘\tCache::put('codeCache', $code, 30);\t}?>4、前後端校驗:提交Token引數校驗
這種方式比較少人說到,個人覺得可以這種方法值得一試。前端(客戶端)在請求傳送簡訊的時候,同時向服務端提交一個Token引數,服務端對這個Token引數進行校驗,校驗通過之後,再向請求傳送簡訊的介面向用戶手機發送簡訊。
5、唯一性限制:微信產品,限制同一個微信ID使用者的請求數量如果是微信的產品的話,可以通過微信ID來進行識別,然後對同一個微信ID的使用者限制,24小時之內最多隻能夠傳送10條簡訊。
6、產品流程限制:分步驟進行例如,在註冊的簡訊驗證碼使用情況下,我們將註冊步驟分為兩個步驟。 使用者輸入手機號碼並設定密碼後,下一步是進入驗證碼驗證步驟。
7、圖形驗證碼限制:圖形驗證通過後再請求介面圖形驗證碼前後臺互動流程比較簡單,主要分為以下三步:
前端部分程式碼
<?php/*** 這裡是判斷獲取的code與存在session的code是否一致,一致則進入下一步,發簡訊驗證碼* 1 首先要處理的是前端要獲取從後端響應過去的code,所以php後端要有生成驗證碼的程式碼,生成session,並且響應給前端用* 2 前端獲取到code後與session做比較*/public function checkCode(Request $request){\t$code = $request->input('code');\tif($code == SESSION['getCode']){\t\t//這裡就是通過驗證碼後,接下來發送簡訊的業務邏輯,根據自己的業務需要把\t\t$consignee_content = $this->smsTplTrait('consignee_order', 1); //查詢簡訊模板 $consignee_content = sprintf($consignee_content); $this->sendSmsTrait($consignee_content, '', 1); //傳送簡訊\t}else{\t\tresponse(['status'=>'0' ,'message' => '驗證碼有誤,無法傳送簡訊']);\t}}?>8、IP及Cookie限制:限制相同的IP/Cookie資訊最大數量
使用Cookie或IP,您可以輕鬆識別同一使用者,然後限制同一使用者(例如,您最多隻能在24小時內傳送20條簡訊)。 但是,可以清理Cookie,可以模擬IP,並且IP在區域網中也可以具有相同的IP。 因此,使用此方法時,應考慮具體情況。
程式碼如下:
//檢查IP傳送次數$keyIp = "mobileIp_sms_send_times:" . PublicFunHelper::getIP() . ":" . date("YmdHis");$smsIpSendTimes = Yii::app()->redis->get($keyIp);if (empty($smsIpSendTimes)) { $smsIpSendTimes = 0;} else if ($smsIpSendTimes >= 20) { $this->_end(1, '您獲取簡訊驗證過於頻繁,請稍後再試!');}9、簡訊預警機制,做好出問題之後的防護
以上的方法可能無法完全防止簡訊被刷。 因此,我們還應該對簡訊進行良好的預警機制,即當簡訊使用量達到一定數量時,向管理員傳送預警訊息,管理員可以立即對簡訊介面進行監控和保護。