97久久国产亚洲精品超碰热,成人又色又爽的免费网站,色偷偷女人的天堂a,男女高潮喷水在线观看,国内精品一线二线三线区别在哪里

返回列表 發(fā)帖
查看: 479|回復(fù): 4

[已解決] 無私分享,discuz僅需微小改動(dòng)即可防范黑客暴力刷接口

1

主題

2

回帖

3

積分

初學(xué)乍練

貢獻(xiàn)
0 點(diǎn)
金幣
0 個(gè)
樓主
發(fā)表于 2025-8-20 09:24:30 | 只看樓主 |倒序?yàn)g覽 |閱讀模式

無私分享,discuz僅需微小改動(dòng)即可防范黑客暴力刷接口
  • 引言
  • 天降飛鍋
  • 攻防階段1:封IP
  • 攻防階段2:關(guān)入口
  • 攻防階段3:調(diào)整驗(yàn)證方式
  • 攻防階段4:升級(jí)驗(yàn)證方式
引言

最近處理了一起針對(duì)開源社區(qū)的攻擊行為,對(duì)方疑似動(dòng)用黑產(chǎn)勢(shì)力,連續(xù)幾天發(fā)動(dòng)境內(nèi)外的肉雞IP發(fā)起大量注冊(cè)用戶請(qǐng)求,當(dāng)然了,并不是真正的要注冊(cè)用戶,而是利用注冊(cè)用戶的動(dòng)作,把短信驗(yàn)證碼額度刷爆,最瘋狂的那天刷了一萬多條驗(yàn)證短信,真是喪心病狂。

面對(duì)這些壞蛋,我們當(dāng)然不能坐以待斃,經(jīng)過幾次攻防交手,暫時(shí)是我們?nèi)〉眯佟?/font>

本文分享這次的攻防經(jīng)過,希望對(duì)其他使用Discuz系統(tǒng)的朋友能有所幫助。

天降飛鍋

某天,突然收到短信運(yùn)營(yíng)商告警,在一天內(nèi)被刷掉一萬多條短信驗(yàn)證碼,這顯然有問題,如果這些都是真實(shí)注冊(cè)請(qǐng)求的話,那我肯定超級(jí)開心,可惜并不是。

攻防階段1:封IP

經(jīng)過對(duì)訪問日志的分析,發(fā)現(xiàn)短時(shí)間內(nèi)有大量的境外IP請(qǐng)求用戶注冊(cè)接口,很快就把每天的短信驗(yàn)證碼額度耗盡,導(dǎo)致正常的用戶注冊(cè)和登錄請(qǐng)求無法使用。

對(duì)于這種情況,第一時(shí)間想到的是封禁這些IP,把它們加到路由黑洞(/sbin/ip route add blackhole $IP)中,這樣做比用IPTABLE加防火墻規(guī)則效率更高,對(duì)服務(wù)器的性能損耗更小,而且不會(huì)給攻擊者回包,反過來影響其效率。

不過,這些專業(yè)的黑產(chǎn)勢(shì)力,顯然是有充足的肉雞資源,直接封IP的做法效果有限,還是無法阻止它們的攻擊。

攻防階段2:關(guān)入口

黑產(chǎn)勢(shì)力實(shí)在太猖狂,除了封IP外,暫時(shí)還沒找到更好的辦法,只能先避其鋒芒,我惹不起還是躲得起的。因此決定暫時(shí)先關(guān)閉注冊(cè)入口,以及短信驗(yàn)證碼方式登錄,只保留密碼登錄功能。

在Discuz管理后臺(tái)關(guān)閉注冊(cè)入口,如下圖所示:

調(diào)整完后,黑產(chǎn)的請(qǐng)求量大概下降了一半,不過這招相當(dāng)于是殺敵一千,自損八百,用戶的有些功能受限了,不是長(zhǎng)久之計(jì)。

攻防階段3:調(diào)整驗(yàn)證方式

在敵人的攻勢(shì)減弱后,就有更多時(shí)間思考和嘗試其他各種御敵之策了。

相對(duì)最優(yōu)的解決辦法是修改注冊(cè)和登錄方式,只允許通過微信掃碼以及gitee/github等SSO單點(diǎn)登錄方式,不過這需要額外功能開發(fā),也就是要另外付費(fèi),先作為備選方案吧,你懂得的。

在管理后臺(tái)反復(fù)查看后,就試著修改驗(yàn)證方式,把原來的的“英文圖片驗(yàn)證碼”修改為“位圖驗(yàn)證碼”,肉眼看起來識(shí)別難度高一丟丟,不過事實(shí)證明,對(duì)于黑產(chǎn)來說,這不是事,應(yīng)該是有方法可以直接破解的,因?yàn)樗鼈兊恼?qǐng)求量并沒明顯下降。

在Discuz管理后臺(tái)修改驗(yàn)證碼設(shè)置:

修改前后驗(yàn)證碼圖片對(duì)比:

攻防階段4:升級(jí)驗(yàn)證方式

再次研究Discuz系統(tǒng)管理后臺(tái),發(fā)現(xiàn)它的驗(yàn)證方式,除了驗(yàn)證碼,還支持提問時(shí)互動(dòng)驗(yàn)證,默認(rèn)支持100以內(nèi)的加減法問題交互驗(yàn)證。

在管理后臺(tái)啟用該功能:

啟用后效果如下圖所示:

出人意料的是,啟用該功能后,防護(hù)效果非常好,幾乎所有的惡意請(qǐng)求都失效了,雖然還能發(fā)起注冊(cè)接口請(qǐng)求,但已經(jīng)無法正確識(shí)別互動(dòng)問題驗(yàn)證碼,也就沒辦法再把驗(yàn)證短信額度給刷爆了。完美!

值得表?yè)P(yáng)的是,該功能還支持自定義互動(dòng)問題,這就給了我們極大發(fā)揮空間,我干脆把部分GreatSQL GCP認(rèn)證考試題作為互動(dòng)問題加進(jìn)來。這樣一來,不但可以防范黑勢(shì)力刷接口,還可以讓正常的社區(qū)用戶順便當(dāng)做GCP考試練習(xí),一舉多得。

美中不足的時(shí),這個(gè)功能只支持針對(duì) 新用戶注冊(cè)、發(fā)帖、修改密碼這三個(gè)動(dòng)作生效,不支持 用戶登錄(尤其是短信登錄)、忘記密碼這兩個(gè)動(dòng)作,還不能全面防住,還需要進(jìn)一步想辦法。

經(jīng)過一番艱難的摸索測(cè)試,最終發(fā)現(xiàn)只需要對(duì)Discuz源碼中的模板文件做非常小的修改即可實(shí)現(xiàn)。

1、修改模板文件 common/seccheck.htm,刪除原文件中第5、8行的條件判斷

  1 {eval
  2         $sechash = !isset($sechash) ? 'S'.($_G['inajax'] ? 'A'.random(3) : '').$_G['sid'] : $sechash.random(3);
  3         $sectpl = str_replace("'", "\'", $sectpl);
  4 }
  5 <!--{if $secqaacheck}-->
  6                 <span id="secqaa_q$sechash"></span>
  7                 <script type="text/javascript" reload="1">updatesecqaa('q$sechash', '$sectpl', '{$_G[basescript]}::{CURMODULE}');</script>
  8 <!--{/if}-->
  9 <!--{if $seccodecheck}-->
10                 <span id="seccode_c$sechash"></span>
11                 <script type="text/javascript" reload="1">updateseccode('c$sechash', '$sectpl', '{$_G[basescript]}::{CURMODULE}');</script>
12 <!--{/if}-->

也就是,將上述原文件修改為

  1 {eval
  2         $sechash = !isset($sechash) ? 'S'.($_G['inajax'] ? 'A'.random(3) : '').$_G['sid'] : $sechash.random(3);
  3         $sectpl = str_replace("'", "\'", $sectpl);
  4 }
  6                 <span id="secqaa_q$sechash"></span>
  7                 <script type="text/javascript" reload="1">updatesecqaa('q$sechash', '$sectpl', '{$_G[basescript]}::{CURMODULE}');</script>
  9 <!--{if $seccodecheck}-->
10                 <span id="seccode_c$sechash"></span>
11                 <script type="text/javascript" reload="1">updateseccode('c$sechash', '$sectpl', '{$_G[basescript]}::{CURMODULE}');</script>
12 <!--{/if}-->

上述改動(dòng)的作用是使得 用戶登錄功能也能同時(shí)啟用兩種驗(yàn)證方式。

2、修改模板文件 member/login.htm,在第140行附近插入下面的代碼(這里直接展示git diff的結(jié)果)

--- a/member/login.htm
+++ b/member/login.htm
@@ -137,6 +137,11 @@
                                 <div class="layui-form-item">
                                     <input type="text" name="phone" lay-verify="required|phone" autocomplete="off" placeholder="手機(jī)號(hào)" lay-reqtext="請(qǐng)?zhí)顚懯謾C(jī)號(hào)" class="layui-input phone">
                                 </div>
+                               <!--{if $secqaacheck || $seccodecheck}-->
+                               <!--{block sectpl}--><div class="layui-form-item secode"><i class="layui-hide"><sec>:</i><sec><i class="img_box"><sec></i></div><!--{/block}-->
+                               <!--{subtemplate common/seccheck}-->
+                               <!--{/if}-->
+                                <div class="layui-form-item">^M
                                 <div class="layui-form-item">

上述改動(dòng)的作用是使得 忘記密碼功能也能同時(shí)啟用兩種驗(yàn)證方式。

至此,用戶注冊(cè)、用戶登錄、忘記密碼 等多處需要用到短信驗(yàn)證碼的入口,均已同時(shí)啟用兩種驗(yàn)證方式。

問題暫時(shí)得以解決,接下來要繼續(xù)關(guān)注黑勢(shì)力還有什么新的小動(dòng)作了。

以上,全文完。

如果對(duì)你有幫助的話,還請(qǐng)幫忙動(dòng)動(dòng)可愛的小手點(diǎn)贊、轉(zhuǎn)發(fā)。




原文鏈接:https://mp.weixin.qq.com/s/PNIwKHNKC1IxOFyOyHXGPA
我知道答案 回答被采納將會(huì)獲得1 貢獻(xiàn) 已有4人回答

1

主題

2

回帖

3

積分

初學(xué)乍練

貢獻(xiàn)
0 點(diǎn)
金幣
0 個(gè)
沙發(fā)
 樓主| 發(fā)表于 2025-8-20 10:28:27 | 只看Ta
管理后臺(tái)中,“驗(yàn)證問答設(shè)置”功能,原先代碼限制了最多只能顯示10個(gè)問題,當(dāng)添加超過10個(gè)后,會(huì)自動(dòng)導(dǎo)致100以內(nèi)加減法功能失效,只需修改一處代碼即可解決:

修改代碼文件:source/admincp/admincp_setting.php 約1796行附近,git diff結(jié)果如下

  1. --- a/source/admincp/admincp_setting.php
  2. +++ b/source/admincp/admincp_setting.php
  3. @@ -1793,7 +1793,9 @@ EOT;
  4.                 showsubtitle(array('', 'setting_sec_secqaa_question', 'setting_sec_secqaa_answer'));

  5.                 $qaaext = array();
  6. -               foreach(C::t('common_secquestion')->fetch_all($start_limit, 10) as $item) {
  7. +               //驗(yàn)證問題顯式最多支持30個(gè)(原先是10個(gè))
  8. +               //同時(shí)解決了原先超過10個(gè)問題后,100以內(nèi)計(jì)算被自動(dòng)禁用的bug
  9. +               foreach(C::t('common_secquestion')->fetch_all($start_limit, 30) as $item) {
復(fù)制代碼

4

主題

45

回帖

55

積分

漸入佳境

貢獻(xiàn)
0 點(diǎn)
金幣
0 個(gè)
板凳
發(fā)表于 2025-8-20 11:58:20 | 只看Ta
學(xué)習(xí)一下~

1

主題

2

回帖

3

積分

初學(xué)乍練

貢獻(xiàn)
0 點(diǎn)
金幣
0 個(gè)
地板
 樓主| 發(fā)表于 2025-8-20 12:51:50 | 只看Ta
葉金榮 發(fā)表于 2025-8-20 10:28
管理后臺(tái)中,“驗(yàn)證問答設(shè)置”功能,原先代碼限制了最多只能顯示10個(gè)問題,當(dāng)添加超過10個(gè)后,會(huì)自動(dòng)導(dǎo)致10 ...

這里其實(shí)還可以修改為下面這樣,實(shí)現(xiàn)問答數(shù)量無上限

foreach(C::t('common_secquestion')->fetch_all() as $item) {

此外,其他代碼文件也要同步修改,完整git diff如下

  1. --- a/source/admincp/admincp_setting.php
  2. +++ b/source/admincp/admincp_setting.php
  3. @@ -1793,7 +1793,10 @@ EOT;
  4.                 showsubtitle(array('', 'setting_sec_secqaa_question', 'setting_sec_secqaa_answer'));

  5.                 $qaaext = array();
  6. -               foreach(C::t('common_secquestion')->fetch_all($start_limit, 10) as $item) {
  7. +               foreach(C::t('common_secquestion')->fetch_all() as $item) {


  8. --- a/source/class/helper/helper_seccheck.php
  9. +++ b/source/class/helper/helper_seccheck.php
  10. @@ -107,7 +107,9 @@ class helper_seccheck {
  11.         public static function make_secqaa() {
  12.                 global $_G;
  13.                 loadcache('secqaa');
  14. -               $secqaakey = max(1, random(1, 1));
  15. +               $secqaakey = rand(1, count($_G['cache']['secqaa']));


  16. --- a/source/function/cache/cache_secqaa.php
  17. +++ b/source/function/cache/cache_secqaa.php
  18. @@ -15,19 +15,25 @@ function build_cache_secqaa() {
  19. -       foreach(C::t('common_secquestion')->fetch_all($start_limit, 10) as $secqaa) {
  20. +       foreach(C::t('common_secquestion')->fetch_all() as $secqaa) {
  21.                 if(!$secqaa['type'])  {
  22.                         $secqaa['answer'] = md5($secqaa['answer']);
  23.                 }
  24.                 $data[$i] = $secqaa;
  25.                 $i++;
  26.         }
  27. -       while(($secqaas = count($data)) < 9) {
  28. +       while(($secqaas = count($data)) < $secqaanum) {
復(fù)制代碼


歡迎關(guān)注我的微信公眾號(hào):老葉茶館

6

主題

138

回帖

176

積分

漸入佳境

貢獻(xiàn)
5 點(diǎn)
金幣
4 個(gè)
5#
發(fā)表于 2025-8-23 22:47:31 | 只看Ta
學(xué)習(xí)一下 ?。?!

本版積分規(guī)則

  • 關(guān)注公眾號(hào)
  • 有償服務(wù)微信
  • 有償服務(wù)QQ

手機(jī)版|小黑屋|Discuz! 官方交流社區(qū) ( 皖I(lǐng)CP備16010102號(hào) |皖公網(wǎng)安備34010302002376號(hào) )|網(wǎng)站地圖|star

GMT+8, 2025-10-16 04:07 , Processed in 0.062654 second(s), 12 queries , Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

關(guān)燈 在本版發(fā)帖
有償服務(wù)QQ
有償服務(wù)微信
返回頂部
快速回復(fù) 返回頂部 返回列表