首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

WordPress 反采集實戰:添加干擾碼保護內容安全

     編輯:PHP 相關知識

前言

隨著內容采集技術日益猖獗,許多 WordPress 站長面臨文章被惡意抄襲的困擾。本文介紹一種通過在輸出內容中注入隱藏干擾碼的方式,有效阻礙采集程式解析正文內容,保護原創成果。

核心原理

利用 WordPress 核心函數 the_content 的過濾機制,在文章輸出前插入隨機生成的、帶有 display:none 樣式的 HTML 標籤(如 <span class="random">干擾文字</span>)。這些干擾碼在瀏覽器中不可見,但會嚴重干擾基於正則或 DOM 解析的采集腳本,導致其抓取到大量無效垃圾字符。

實現步驟

1. 編寫干擾碼生成函數

打開 wp-includes/post-template.php,在文件最頂部添加以下函數:

<?php
function RndString($body) {
    // 最大間隔距離(若檢測不到 <p> 標籤,插入干擾碼的最大字符間隔)
    $maxpos = 1024;
    // 字體顏色(設為白色隱藏)
    $fontColor = "#FFFFFF";
    // 隨機生成 4 組類名及對應樣式
    $st1 = chr(mt_rand(ord("A"),ord("Z"))).chr(mt_rand(ord("a"),ord("z"))).chr(mt_rand(ord("a"),ord("z"))).mt_rand(100,999);
    $st2 = chr(mt_rand(ord("A"),ord("Z"))).chr(mt_rand(ord("a"),ord("z"))).chr(mt_rand(ord("a"),ord("z"))).mt_rand(100,999);
    $st3 = chr(mt_rand(ord("A"),ord("Z"))).chr(mt_rand(ord("a"),ord("z"))).chr(mt_rand(ord("a"),ord("z"))).mt_rand(100,999);
    $st4 = chr(mt_rand(ord("A"),ord("Z"))).chr(mt_rand(ord("a"),ord("z"))).chr(mt_rand(ord("a"),ord("z"))).mt_rand(100,999);
    $rndstyle[1]["value"] = ".{$st1} { display:none; }";
    $rndstyle[1]["name"] = $st1;
    $rndstyle[2]["value"] = ".{$st2} { display:none; }";
    $rndstyle[2]["name"] = $st2;
    $rndstyle[3]["value"] = ".{$st3} { display:none; }";
    $rndstyle[3]["name"] = $st3;
    $rndstyle[4]["value"] = ".{$st4} { display:none; }";
    $rndstyle[4]["name"] = $st4;
    $mdd = mt_rand(1,4);
    $rndstyleValue = $rndstyle[$mdd]["value"];
    $rndstyleName = $rndstyle[$mdd]["name"];
    $reString = "<style> $rndstyleValue </style> ";
    // 可用於包裹干擾碼的標籤
    $rndem[1] = "font";
    $rndem[2] = "div";
    $rndem[3] = "span";
    $rndem[4] = "p";
    // 讀取干擾字符庫(需配合 RndString.php 文件)
    $fp = fopen(dirname(__FILE__)."/RndString.php","r");
    $start = 0;
    $totalitem = 0;
    while(!feof($fp)){
        $v = trim(fgets($fp,128));
        if($start==1){
            if(ereg("#end#",$v)) break;
            if($v!=""){ $totalitem++; $rndstring[$totalitem] = ereg_replace("#", "", $v); }
        }
        if(ereg("#start#",$v)){ $start = 1; }
    }
    fclose($fp);
    // 遍歷內容,在段落結束或超過間隔處插入干擾碼
    $bodylen = strlen($body) - 1;
    $prepos = 0;
    for($i=0;$i<=$bodylen;$i++){
        if($i+2 >= $bodylen || $i<50) $reString .= $body[$i];
        else{
            @$ntag = strtolower($body[$i].$body[$i+1].$body[$i+2]);
            if($ntag=="</p" || ($ntag=="<br" && $i-$prepos>$maxpos) ){
                $dd = mt_rand(1,4);
                $emname = $rndem[$dd];
                $dd = mt_rand(1,$totalitem);
                $rnstr = $rndstring[$dd];
                if($emname!="font") $rnstr = " <$emname class=\"$rndstyleName\">$rnstr</$emname> ";
                else $rnstr = " <font color=\"$fontColor\">$rnstr</font> ";
                $reString .= $rnstr.$body[$i];
                $prepos = $i;
            }
            else $reString .= $body[$i];
        }
    }
    unset($body);
    return $reString;
}
?>

2. 掛載到 the_content 函數

在同一文件中找到 function the_content,將其修改為:

function the_content($more_link_text = "(more...)", $stripteaser = 0, $more_file = "") {
    $content = get_the_content($more_link_text, $stripteaser, $more_file);
    $content = apply_filters("the_content", $content);
    $content = str_replace("]]>", "]]>", $content);
    $content = RndString($content); // 新增這一行
    echo $content;
}

3. 部署字符庫文件

將附件中的 RndString.php 上傳至 wp-includes/ 目錄。該文件包含 #start# 到 #end# 之間的干擾字符串,每行一條。

注意事項

  • 修改核心文件意味著 WordPress 升級後會失效,建議將代碼封裝為插件或使用 functions.php 配合 the_content 過濾器實現,避免修改核心。
  • 干擾碼雖能阻礙簡單采集,但無法防禦高級模擬瀏覽器渲染的采集器,建議結合 IP 限制、驗證碼、內容加密等多重手段。
  • 過度干擾可能影響 SEO 或無障礙閱讀,請謹慎調整插入頻率與字符庫內容。

結語

通過注入不可見干擾碼,可大幅提高采集成本,保護原創內容。站長可根據自身需求調整算法參數,構建更強健的防護體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved