...EGO ALPHA ET OMEGA, PRIMUS ET NOVISSIMUS, PRINCIPIUM ET FINIS...
...EGO PRAETERITUS, ET NUNC, ET POSTERUS: ET IN SEMPER...
...EGO TOTUS, UNUS IN SAECULA SAECULORUM...
Ronde des Lutins, La

 

 

 

 

Comment Spam驗證碼防護 網路技術 - TT


利用Session ID及隨機圖檔對應生成Comment驗證碼,適用於0.9X

  • 截取Session ID產生驗證碼,故在Session過期前驗證碼不會變(此非錯誤不需回報)
  • 免GD模組,但需自行製作亂數名稱圖檔上傳



    製作圖檔

    1.製作數字0-9及英文字母a-z共36張文字圖片

    2.將所有圖檔任意命名,不可有任何規律性

    3.另行記下檔名與圖片文字的對應

    4.在images/下新開一個資料夾,命名為code,將所有圖片上傳於其中



    修改方法

    1.打開inc_function.php

    尋找以下語法:

    if (!$c_guest_homepage) $c_guest_homepage = "http://";
    if (return_authority()) { $buf = substr($p_user_pass, 8); $is_admin = 1; }
    else $is_admin = 0;

    $bf1 .= $skin->s_rp;
    $bf1 = str_replace("[##_guest_name_##]", $c_guest_name, $bf1);

    加入粗體部份:

    if (!$c_guest_homepage) $c_guest_homepage = "http://";
    if (return_authority()) { $buf = substr($p_user_pass, 8); $is_admin = 1; }
    else $is_admin = 0;

    $scode[0] = substr(session_id(), 0, 1);
    $scode[1] = substr(session_id(), 1, 1);
    $scode[2] = substr(session_id(), 2, 1);
    $scode[3] = substr(session_id(), 3, 1);
        
    /* 請將(filename)置換為先前記錄之對應檔名,不需加後綴(如.gif、.jpg) */

    for ($i=0; $i<4; $i++) {
      if ($scode[$i]== "1") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "2") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "3") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "4") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "5") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "6") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "7") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "8") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "9") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "0") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "a") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "b") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "c") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "d") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "e") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "f") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "g") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "h") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "i") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "j") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "k") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "l") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "m") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "n") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "o") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "p") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "q") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "r") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "s") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "t") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "u") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "v") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "w") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "x") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "y") $scode[$i] = "(filename)";
      elseif ($scode[$i] == "z") $scode[$i] = "(filename)";
    }

    /* 如果圖檔為.jpg而非.gif請自行替換類型 */

    $scode[4] = "<img src=$s_root_path"."images/code/$scode[0].gif><img src=$s_root_path"."images/code/$scode[1].gif><img src=$s_root_path"."images/code/$scode[2].gif><img src=$s_root_path"."images/code/$scode[3].gif>";

    $bf1 .= $skin->s_rp;
    $bf1 = str_replace("[##_rp_input_code_##]", $scode[4], $bf1);
    $bf1 = str_replace("[##_guest_name_##]", $c_guest_name, $bf1);

    2.打開add_exe.php

    尋找以下語法:

    setcookie ("c_guest_homepage", $c_homepage, time()+60*60*24*30);

    put_query ("
      insert into t3_".$dbid."_reply (
        pno, name, homepage, body, password, is_secret, regdate, ip
      ) values (
        $num, '".str_tag_off($c_name)."', '".str_tag_off($c_homepage)."', '".str_tag_off($c_body)."', password('$c_password'), '$c_is_secret', '".time()."', '".$REMOTE_ADDR."'
      )
    ");

    set_rp_cnt($num);

    加入粗體部份:

    setcookie ("c_guest_homepage", $c_homepage, time()+60*60*24*30);

    if(substr(session_id(), 0, 4) == $verify){
      put_query ("
        insert into t3_".$dbid."_reply (
          pno, name, homepage, body, password, is_secret, regdate, ip
        ) values (
          $num, '".str_tag_off($c_name)."', '".str_tag_off($c_homepage)."', '".str_tag_off($c_body)."', password('$c_password'), '$c_is_secret', '".time()."', '".$REMOTE_ADDR."'
        )
      ");
    } elseif ($verify == null) {
      ?><head><meta http-equiv="Content-type" content="text/html; charset=utf-8">
      <script type="text/javascript"> alert("請輸入驗證碼\t"); </script></head><?
      exit;
    } else {
      ?><head><meta http-equiv="Content-type" content="text/html; charset=utf-8">
      <script type="text/javascript"> alert("驗證碼錯誤\t"); </script></head><?
      exit;
    }

    set_rp_cnt($num);

    3.打開skin/(skin)/skin.html

    將驗證碼加入:

    [##_rp_input_code_##]

    將驗證輸入欄加入:

    <input type="text" name="verify" size="8">



    * 請自行將##替換為半形
  • 06/06/10 06:05
    VIEWED (25135) TRACKBACK (6) REPLIES (44)

    Kamic 06/06/10 04:35
    妳好!
    找了好久終於找到救星了……
    自己網誌的迴響被spam攻擊,只能被迫關閉迴響功能
    心裡雖然怒不可抑
    卻又無可奈何……
    有TT使用者能解決這問題
    真是很感激……

    彤影 06/06/10 08:09
    其實tt中文官站很久以前就有驗證碼的修改了
    如果你的空間有開GD可以試看
    http://www.twtt.org/viewtopic.php?t=403

    我的方法是開不了GD的變通,需要另行製作圖檔上傳

    Kamic 06/06/10 09:54
    感謝妳的回應!
    其實在之前我有照著jinwei兄的教學修改過……

    我空間GD有開
    verify.php與字型檔都已上傳
    也能正常運作
    index.php與inc_function.php都也照著修改了
    但不知為何測試後
    驗證碼不需填入也能照樣留言
    不知道是不是有額外要修改的地方呢??
    看到貴站能成功擋掉comment spams
    才想說是不是有其他驗證碼修改法……

    彤影 06/06/10 10:54
    那個教學裡改index.php是針對留言版的
    如果用在comment上應該改add_exe.php

    Ulen 06/06/12 07:15
    其實我是來想說……驗證碼輸入錯誤的話,會把輸入的文字給吃掉@@
    看jin大那裏有個驗證碼錯誤提示,想請問這個也能不能做一個,以及具體要怎麽做呢?

    彤影 06/06/12 08:04
    TO Ulen:
    已經加入警告語法,請參照修改add_exe.php

    Kamic 06/06/12 08:35
    感謝!已修正!

    火汐 06/06/12 08:40
    影大,最後那個skin.html上面應該怎麼改呢?
    我把<input type="text" name="verify" size="8">放在secret語法的後面,然後加上[##_rp_input_code_##],這樣有code輸入框出現,卻沒有code圖片出現 = =
    改好的兩個php檔在後臺已經發揮作用,然而前臺看不到圖片就無法輸入code,這樣回復就無法出現了…… OTL

    彤影 06/06/12 08:46
    TO 火汐:
    請檢查inc_function.php中的[##_rp_input_code_##],#是否修改為半形

    火汐 06/06/12 10:41
    感谢影大~~我问题解决了 >v<

    06/06/12 10:57
    此回覆僅限站長瀏覽

    彤影 06/06/12 11:05
    TO 小狼:
    可以轉載,只要標明出處並trackback即可~

    air 06/06/15 02:12
    请问为什么偶那里明明输入了验证码却还提示“请输入验证码”。。这样就没有办法添加回复了啊
    请问有什么解决办法呢?

    彤影 06/06/15 02:58
    TO air:
    檢查你在add_exe.php中增加code的位置對不對

    air 06/06/15 10:11
    多谢回复^_^可是我都仔细检查过了,都是照做的。。
    代码里面行与行之间有没有空行应该没关系吧,除此之外一切都是按照上面方法做的。
    好像没人出现我这个问题。。

    彤影 06/06/15 22:20
    TO air:
    檢查inc_function.php中那串檔名對應是否有錯

    kano 06/06/20 05:24
    和air一樣的問題
    我也都檢查過了,對應檔名也沒錯

    hanako 06/06/20 09:33
    從ulen桑処摸來這裡,總算是有解決的方法TvT
    不過我這裡出了些小問題,和上面air和kano的問題相似,就是有驗證碼但是照樣輸入后會提示驗證碼不正確……add_exe.php和inc_function.php都檢查過,code位置沒錯對應檔名也沒錯||||
    因爲我本身對代碼一竅不通,所以還是來向彤影桑求救尋求解決方法TvT

    彤影 06/06/22 01:54
    ……圖檔的位置有沒有放對?
    是在images下建立一個code的資料夾放圖

    kano 06/06/23 00:40
    圖檔的位置也是對的,顯示也很正常

    彤影 06/06/23 02:55
    那唯一的可能是你的server記錄session的問題
    這樣就沒辦法了= =

    亮晶晶* 06/07/10 15:06
    彤影..
    我的問題跟上面那一位好像也是一樣的
    圖檔都OK 也顯示的出來 但是輸入了 就是都會顯示輸入驗證碼錯誤
    這..實在沒辦法解決了嗎?!

    亮晶晶* 06/07/10 15:31
    彤影~不好意思~
    原來~我都是輸入大寫...
    所以..才不行~
    我剛剛無意間用小寫輸入~就可以了~
    哈哈^^"
    真是呆呆的我..
    感謝您的提供教學~~

    亮晶晶* 06/07/12 13:04
    彤影 不好意思~我又來了
    這次我想問的是...
    我驗證碼已經ok了
    不過卻出現..有些篇文章...
    驗證碼已經輸入了~~卻按送出得時候
    會顯示"請輸入驗證碼"
    有的文章會 有的文章不會
    這是為什麼呢?!

    彤影 06/07/13 05:20
    TO 亮晶晶*:
    可能是session過期了或session path滿了

    亮晶晶* 06/07/13 10:56
    seesion過期?! 過期該怎麼處理呢?!
    session path滿了?!那有什麼方法可以把他清除嗎?!
    不好意思~麻煩妳了~
    而且還有另外的問題...
    按重整,驗證碼還是不會變@@"

    彤影 06/07/15 00:59
    清空session_path就好了
    還有驗證碼本來就不會每次都變……上面有述

    Y 06/07/30 08:39
    你好,我傢TT按照這個教程加入驗證碼後,有時會發生明明輸入正確但是提示驗證碼錯誤的情況,請問這是什麽問題?

    彤影 06/07/30 22:45
    可能是session過期了或session path滿了,上面有述

    Y 06/08/02 10:05
    測試出的結果是如果將BLOG置於框架内就一定會出現驗證碼錯誤,單頁就不會有錯,如果進入過單頁再入框架頁也不會有錯。這個難道就是所謂的RP= =|||

    彤影 06/08/05 00:51
    啊,那可能是因為驗證圖片讀的是框架內頁面的session
    但在檢查驗證碼時比對的是框架頁的session

    Y 06/08/06 17:40
    那麽這個問題除了不用框架有沒有解決辦法OTZ

    彤影 06/08/06 22:22
    可以是可以但驗證碼會記錄在頁面上
    這樣就沒有意義了,因為會被bot偵測到

    Y 06/09/09 16:35
    不好意思我又來了……= =
    我用了TT0.96 SE版的置頂功能,測試結果置頂貼不能回復,會跳出請輸入驗證碼的錯誤,請問這個是算是什麽問題?

    彤影 06/09/10 05:18
    TO Y:
    你用的是簡體版本改的置頂功能嗎?
    那個有動到結構所以可能會出現session對應問題

    Y 06/09/10 08:02
    確實是簡體的,目前是把公告的回復禁止了。謝謝回復。

    06/11/19 09:35
    哇~~謝謝分享喔!!
    撐了好久, 終於受不了了, 今天又被spam狂灌, 真是氣死我了啊…
    我實在沒時間想升級或是跳槽的事啊, 只好搜尋一下看有沒有解決方法, 就找到你這兒來囉~
    照著你的方法實做了一下, 成功了耶~~~哈哈~~
    真開心...希望可以解決這個問題啊!!! 這時候就很慶幸自己還是0.9x版的, 所以可以用:D
    Anyway..超級謝謝你的分享喔!!大感謝啊!!!^_____^

    ET 06/11/19 12:55
    Hi! 最近我部落的spam也越來越嚴重, 多虧雁跟我說你這邊有修改方法. 真是萬分感謝!

    Stan 06/11/20 16:09
    感謝您的大作, 讓我也解決了困擾已久的問題.

    另外想請教二個問題:
    1. 要如何讓驗證碼只出現數字? (我試過把英文的部份註解起來, 但程式仍然會去取英文字)
    2. 英文的驗證碼要如何只能輸入大寫? (我也試過把英文的部份改成大寫, 但圖片就出不來了)

    彤影 06/11/22 09:53
    TO Stan:
    兩個問題都不可能,因為是由你的session擷取驗證碼,而session一定是小寫英文和數字組合

    WH 06/11/25 19:50
    我想知道变量verify究竟是怎样从skin.html传递到add.exe.php的呢。我这里每次都会显示“验证码未输入”,说明$verify在add.exe.php是null...
    试过把$verify改成$_POST['verify']还是不行啊。
    恳请指教。

    彤影 06/11/27 07:00
    TO WH:
    你是有用框架嗎?如果有框架的話就會讀入失敗

    wnjo 06/12/20 09:27
    你好!
    用了這方法一陣子沒問題
    可最近不知怎地,迴響內容出不來
    不知問題可能為何,煩請查看一下
    謝謝!

    炎狼 07/02/25 08:10
    改後就開不了了..出現
    Parse error: parse error in d:\www\m12studio\wwwroot\blog\y2y\inc_function.php on line 403
    403行就是for ($i=0; $i<4; $i++) {
    是甚麼一回事呢OTL...

    NAME
    URL
    CODE
    PASS
    SECRET

    PAGE: 1 ...  44 45 46 47  48  ...  111
    TODAY: 57 | YESTERDAY: 115 | TOTAL: 890788