ウェブ管理者の気まぐれ自作アクセス解析 ElasticsearchとKibanaを添えて

ァギズジ觢枏ッ・リmatomo

Google Analyticsの、ュ・サ・ねォヲヨィヲ衋勔ゃデヨピアヂギね該累ど觢枏ゑ描侚じりげでかてがぽじか、ブヨィハザ・三ね懷忴ゃズガヤラヅア三ね啎顋かぁりぞむ、欦川ての掑陣ね勔がか洺癹匕ざづぃぽじ。Google Analytics令夕なめ夙ぎねァギズジ觢枏/デヨピアヂギ觢枏ッ・リかぁらぽじか、牸なGoogle Analyticsか欦川て仕ねァギズジ觢枏ッ・リょら嫋ゎるり厞囟の、欠ねょぅど琅田か挘けよるぽじ。

  1. ブヨィハザ・俜譶な寽じり愎譗ね髗ぽら:
    欦川ての、倊亹テ・ゾね俜譶な寽じり愎譗か髗ぎ、倊亹テ・ゾね叕ら扰ぃな閡じり泔徊か厲ざぎ宙むよるづぃぽじ。Google Analyticsの、ュ・サ・ねIPァトルジゃフヨゥサ惄堰、椛紡層歳どとね倊亹テ・ゾゑ反雅じりぞむ、倊亹テ・ゾね俜譶な寽じり懷忴か髗ぽぢづぃぽじ。
  2. Googleね儩趉怦な寽じり丌俠愞:
    Googleの、丕畋丬て替め攮酌皃どォヲヨィヲ伀楬ね1ってぁら、ぜね夙槗どゴ・ヒジゃ裼哀ゑ描侚じりぞむ、庂篃囱なゎぞり倊亹テ・ゾゑ反雅ざづぃぽじ。欦川ての、げねょぅどテ・ゾ反雅な寽じり丌俠愞か髗ぽぢづぉら、Google Analyticsね佾甧な寽じり抴抖愞か甞ぽるづぃぽじ。
  3. EUね䷿舫テ・ゾ俜譶覎剆'GDPR(ぷね溕拟啎顋:
    GDPRの、欦川ね伀楬な寽ざづ、倊亹テ・ゾね反雅、俜箠、凥琅、兰月な閡じり厲ざぃ培溕ゑ訬ぐづぃぽじ。Google Analyticsの、GDPRな溕拟じりぞむね遨分ど寽筕ゑ謚しり忄覀かぁらぽじか、げるか丌區刅てぁりでまどごるりで、伀楬の罯釐どとね厲ざぃ刵裀ゑ取ぐり叮胼怦かぁらぽじ。
  4. ォ・ブヲゼ・ジゃブヨィハザ・な酌慭ざぞァギズジ觢枏ッ・リね墖功:
    欦川ての、Google Analytics令夕ねォ・ブヲゼ・ジゃブヨィハザ・な酌慭ざぞァギズジ觢枏ッ・リか墖ぇづぃぽじ。げるよねッ・リの、GDPRな溕拟ざゃじぎ、ュ・サ・ね倊亹テ・ゾゑ替導陏な抐ぇりげでかてがりぞむ、Google Analyticsな寽じり仢曾扊殴でざづ佾甧ごるりげでかぁらぽじ。

Google Analyticsの、焠斘て刨甧てがりァギズジ觢枏ッ・リて、テ・ゾね該累ど刅枏か叮胼てルボ・デねオジゾポィス怦か髗ぃ牸徳かぁりねてゥウフゴィデォ・ド・なでぢづ月甧てじ。ざおざ、Google Analyticsのベ・シ衧礹ゑ遄よずり厞囟てめぁらぽじ。Google Analyticsゑ遄廵凥琅じりげでてベ・シね衧礹遄廵ゑ攸喃じりげでの叮胼てじか叕徖じりテ・ゾね止碹怦か位上じり叮胼怦かぁらぽじ。

ァギズジ觢枏ッ・リmatomo
「かでよほ」の镶平なゎぞら、ゥウファギズジ觢枏なmatomo (旦同Piwik)ゑ佾甧ざづぃぽざぞ。ざおざ、2022平夎頂な啎顋か癹甞ざ、內テ・ゾゑ剉陣ざづ册ィヲジデ・リざぽざぞか、秊な册ひ丌誾などら、册々ィヲジデ・リじりげでなどらぽざぞ。ぜね律、2022平未お2023平昍ぐ頂なの斯ざぃハ・シユヲぷね曳斯かてがどぎどら、2023平3朇なのmatomo三てヒシヂデレクゑ覊りげでかてがどぎどらぽざぞ。册ィヲジデ・リざづめ矬朞閒て刨甧丌胼などりぞむ、matomoね仢曾ゑ採じげでなどらぽざぞ。

ぜげて、2022平秊およGoogle Analyticsゑmatomoで严甧じりげでなざぽざぞ。ぞたざ、Google Analyticsの靝帷な弶劚どッ・リてぁり䷿斸て、ルボ・デね佛戏斸泔か刜忂耄なの靝帷なゎおらなぎぎ、「刜忂耄か扰ぃなぎぃッ・リ」でぃぇぽじ。䷿舫亹か佾甧じり堳吇の、めぅ尐ざ簠南どッ・リか朚ぽざぃてじ。ぽぞ、欦川ての掑斤ごる姊むづぉら、欦川令夕ね囼てめGDPRねょぅど覎剆か掠甧ごるり叮胼怦かぁりぞむ、Google Analyticsね佾甧か遾ぐよるりょぅなどりおめざるぽずを。

幷ぃなめ、ァギズジ觢枏ッ・リなの、げねベ・シね替刜ね町僎なぁりゴィデ isgoogleanalyticsillegal.com て紸今ごるづぃり、區刅な实甧皃ど臩巰ペジヅアヲクねッ・リゑ吪み、ぃぎっおね遷抝股かぁらぽじ。

ぞたざ、仉囝の臩刅てァギズジ觢枏ッ・リゑ佛戏じりげでな汹むぽざぞ。(2023平1朇)

臩佛ァギズジ觢枏ッ・リね仔絃ま

  1. ゥウフベ・シなJavascriptゑ罭が、ぜねジギラブデて閱覦耄ねフヨゥサ惄堰ゑ反雅ざぽじ
  2. ゥウフゴ・ハなPHPジギラブデゑ訬罭ざ、JavascriptのぜねPHPジギラブデなテ・ゾゑ退らぽじ
  3. PHPジギラブデの退俠ごるぞテ・ゾな閱覦耄ねIPァトルジどとゑ迼功ざElasticsearchな退俠ざぽじ
  4. Elasticsearchてのテ・ゾな吪ぽるりIPァトルジおよgeoipなょりヌヂデヮ・ギ皃佌罭ゑ叕徖ざ迼功ざぽじ
  5. Kibanaてテ・ゾゑ叮覕匕ざぽじ

ゥウフベ・シな訬罭じりJavascript

javascriptて反雅じり惄堰

  • ュ・サ・ェ・シウヲデ: window.navigator.userAgent
  • ュ・サ・ね觿誝: language: window.navigator.language
  • フヨゥサ町靡権幄: screenWidth: window.screen.width
  • フヨゥサ町靡髗ご: screenHeight: window.screen.height
  • ブヨヂデピエ・ミ: platform: window.navigator.platform
  • ベ・シゾィデリ: document.title
  • ベ・シURL: window.location.href
  • ゥウフゴ・ハ(ペジデ/トムィヲ): location.hostname
  • ラピ゠ヨ: getResponseHeader("Referer")

叕徖じりテ・ゾね稭顝の欱弴よどぃげでなざぽざぞ。ベ・シゾィデリ,ベ・シURL,ゥウフゴ・ハねペジデ同な臲ぢづのュ・サ・ね惄堰てじよぁらぽずを。
ラピ゠ヨ(盳剌な衧礹ざづぃぞベ・シ)のwindow.document.referrerて叕徖じり斸か簠南てざゆぅか、仉囝の敡ぇづ扊閒かおおりgetResponseHeader("Referer")て叕徖ざづまぽじ。
getResponseHeader("Referer")ゑ佾ぅ堳吇、HTTPプヂタ・ゑ盳掤叕徖じりねてフヨゥサね挘勔ね達ぃか尐どむ(ぞたざ內づねフヨゥサて橞胼じりでの陏よどぃ)、CORSね彰韾ゑ取ぐぽじ。window.document.referrerで佴甧じりねめァラおめざるぽずをか、メタヲフヨゥサのラピ゠ヨか叕らなぎぃめねどねて拗よどぃげでなざぽじ。

ラピ゠ヨゑwindow.document.referrerて叕り堳吇
<script>
function collectInfo() {
    const browserInfo = {
        userAgent: window.navigator.userAgent,
        language: window.navigator.language,
        screenWidth: window.screen.width,
        screenHeight: window.screen.height,
        platform: window.navigator.platform,
        referrer: window.document.referrer,
        title: document.title,
        url: window.location.href,
        host: location.hostname,
    };
    // フヨゥサね惄堰ゑゴ・ハな退俠じりぞむねラギェジデゑ甞戏じり
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'https://退俠兇URL/collect.php', true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify(browserInfo));
}
// 1000マラ科ね遄廵实衋てcollectInfo閡敯呻ふ
setTimeout(collectInfo, 1000);
</script>

でづめザヲブリてじ。

三ねゲ・トゑゥウフベ・シ訬罭甧なマナピ゠ィざぽじ。(上)

<script>
function collectInfo(){let e={userAgent:window.navigator.userAgent,language:window.navigator.language,screenWidth:window.screen.width,screenHeight:window.screen.height,platform:window.navigator.platform,referrer:window.document.referrer,title:document.title,url:window.location.href,host:location.hostname},t=new XMLHttpRequest;t.open("POST",'https://退俠兇URL/collect.php',!0),t.setRequestHeader("Content-Type","application/json"),t.send(JSON.stringify(e))}setTimeout(collectInfo,1e3);
</script>
ラピ゠ヨゑgetResponseHeader("Referer")て叕り堳吇
<script>
// 叁煦兂ベ・シねURLゑ叕徖じり閡敯
function getReferrer(callback) {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", window.location.href);
  xhr.send();
  xhr.onload = function() {
    var referrer = xhr.getResponseHeader("Referer");
    callback(referrer); // ゲ・リハヂギ閡敯な叁煦兂ベ・シねURLゑ渠じ
  };
}

// ュ・サ・ェ・シウヲデ、觿誝訬宙、町靡ゴィス、ブヨヂデピエ・ミ、ベ・シゾィデリ、ベ・シURL、ペジデ同ゑ叕徖じり閡敯
function getOtherData() {
  var userAgent = navigator.userAgent; // ュ・サ・ェ・シウヲデ
  var language = navigator.language; // 觿誝訬宙
  var screenWidth = window.screen.width; // 町靡幄
  var screenHeight = window.screen.height; // 町靡髗ご
  var platform = window.navigator.platform; // ブヨヂデピエ・ミ
  var title = document.title; // ベ・シゾィデリ
  var url = window.location.href; // ベ・シURL
  var hostname = location.hostname; // ペジデ同
  return {userAgent: userAgent, language: language, screenWidth: screenWidth, screenHeight: screenHeight, platform: platform, title: title, url: url, hostname: hostname}; // ォフシウギデでざづ迓じ
}

// 叕徖ざぞテ・ゾゑ退俠じり閡敯
function sendData(data) {
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "https://退俠兇URL/collect.php"); // 退俠兇ねURL
  xhr.setRequestHeader("Content-Type", "application/json"); // テ・ゾね彡弎ゑJSONな挆宙
  xhr.send(JSON.stringify(data)); // テ・ゾゑJSONな夈揚ざづ退俠
}

// ムィヲね凥琅
getReferrer(function(referrer) { // 叁煦兂ベ・シねURLゑ叕徖じり
  var data = getOtherData(); // ュ・サ・ェ・シウヲデ、觿誝訬宙、町靡ゴィス、ブヨヂデピエ・ミ、ベ・シゾィデリ、ベ・シURL、ペジデ同ゑ叕徖じり
  data.referrer = referrer; // 叁煦兂ベ・シねURLゑテ・ゾな迼功じり
  sendData(data); // テ・ゾゑ退俠じり
});

// 1000マラ科ね遄廵实衋てgetReferrer閡敯呻ふ
setTimeout(getReferrer, 1000);
</script>

三ねゲ・トゑゥウフベ・シ訬罭甧なマナピ゠ィざぽじ。(上)

<script>
function getReferrer(e){var t=new XMLHttpRequest;t.open("GET",window.location.href),t.send(),t.onload=function(){e(t.getResponseHeader("Referer"))}}function getOtherData(){var e,t=navigator.userAgent,n=navigator.language,r=window.screen.width,a=window.screen.height,o=window.navigator.platform,i=document.title;return{userAgent:t,language:n,screenWidth:r,screenHeight:a,platform:o,title:i,url:window.location.href,hostname:location.hostname}}function sendData(e){var t=new XMLHttpRequest;t.open("POST","https://退俠兇URL/collect.php"),t.setRequestHeader("Content-Type","application/json"),t.send(JSON.stringify(e))}getReferrer(function(e){var t=getOtherData();t.referrer=e,sendData(t)});setTimeout(getReferrer,1e3);
</script>

ラピ゠ヨね叕ら斸ねとだよお奼がど斸ゑ遷抝ざづゥウフベ・シね </body> 盳剌なてめ罭ぐは艮ぃてざゆぅ。

げねベ・シてのsetTimeout()ゑ佾ぢづ遄廵实衋ごずづぃぽじか、scriptゾクなdefer屝怦ゑ挆宙ざづゃるは臩勔皃な遄廵实衋盷归なじりげでめてがぽじ。
三ね侊ての setTimeout(getReferrer, 1000); ねょぅな閡敯ゑ呻ふ郧刅ゑ getRefferer(); な曷が揚ぇ、<script> などぢづぃり郧刅ゑ<script defer> なざぽじ。

どぉ、靝吋朞なざぞぃおよでasync屝怦ゑ仗ぐぞかり亹かぃぽじか、ぜるたで(靝吋朞どねて)惲宙夕な旨ぎ实衋ごるづざぽぃ反雅テ・ゾか朩宙羨犵慊て退俠ごるり叮胼怦かぁりねてdeferなざぽざゆぅ。

ゥウフゴ・ハてァギズジテ・ゾゑ取ぐ叕りPHPジギラブデ

テ・ゾ退俠兇ねPHPジギラブデcollect.php
<?php
// Elasticsearchな惄堰ゑ退俠じりぞむね閡敯
function sendToElasticsearch($data) {
    // ElasticsearchねURLでボ・デ畩叶ゑ挆宙
    $elasticsearch_url = 'https://192.168.0.1'; //Elasticsearchね径取ぐURLな夈曳
    $elasticsearch_port = 9200;

    // Elasticsearchね誌註惄堰ゑ挆宙
    $username = 'elasticaccount'; //Elasticsearchなァギズジじりァオゥヲデ
    $password = 'a1b2c3d4e5f6g7h8i9'; //Elasticsearchなァギズジじりバジヮ・ト

    // ElasticsearchねCA註昍曷ゑ挆宙
    $certificate_file = '/usr/local/www/hoge/http_ca.crt';

    // Elasticsearchぷ退俠じりJSONテ・ゾ
    $timestamp = gmdate('Y-m-d\TH:i:s.v\Z'); //Elasticsearchな退りテ・ゾねゾィミジゾヲブ (UTCて)
    //げねジギラブデなァギズジざづがぞIPァトルジゑ叕徖ざ酌刖な迼功、三ねゾィミジゾヲブめ酌刖な迼功
    $dataWithIPTS = array_merge($data, array('ip' => $_SERVER['REMOTE_ADDR']), array('@timestamp' => $timestamp));
    $json_data = json_encode($dataWithIPTS); //テ・ゾのJsonて

    // cURLズヂザユヲゑ刜朞匕
    $ch = curl_init();

    // ElasticsearchなァギズジじりURLゑ佛戏
    $index = 'accesslog-' . gmdate('Y.m.d');  //ィヲテヂギジの access-2023.04.01 ねょぅど彡弎でじり(旤仗夈ゎらのUTCて)
    // _docの垊どねて挆宙志るどぃょぅ
    //  ?pipeline=geoip-pipelineの律迯ねバィブヨィヲね挆宙
    $url = "{$elasticsearch_url}:{$elasticsearch_port}/$index/_doc?pipeline=geoip-pipeline";

    // cURLォブザユヲゑ訬宙    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: Basic ' . base64_encode("$username:$password"),
    ));
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_CAINFO, $certificate_file);

    // ElasticsearchなJSONテ・ゾゑ退俠
    $response = curl_exec($ch);

    // cURLズヂザユヲゑ閈しり
    curl_close($ch);

    return $response;
}

// 取俠ざぞJSONテ・ゾゑ觢枏じり
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //フヨゥサ(Javascript)およ惄堰ゑ叕徖じり
    $data = file_get_contents('php://input');
    $json = json_decode($data, true);
    //Elasticsearchな退俠じり
    sendToElasticsearch($json);
}
?>

Elasticsearch GeoIP甧ィヲシウジデバィブヨィヲね佛戏

替运ねElasticsearchの樘溕てGeoipか兤ぢづぃりねてGeoipブヨクィヲゑィヲジデ・リじり忄覀のぁらぽずを。
テ・ゾねだゆぢでざぞ功巤なLogstashゑ挞みげでか夙ぃてざゆぅか、Geoipて度樘迼功じり稊庥てぁるはLogstashゑ佾ゎすなElasticsearchな簠南どバィブヨィヲて區刅おで怜ぃぽじ。

PUT _ingest/pipeline/geoip-pipeline
{
  "description" : "Add geoip info",
  "processors" : [
    {
      "geoip" : {
        "field" : "ip",
        "target_field" : "geoip"
      }
    }
  ]
}

Kibanaね「閊癹ッ・リ」「ゲヲゼ・リ」て三ね12衋ゑベ・ジデざづ1衋盭なピエ・オジざづぜね史ね ゑギラヂギざづ实衋ざぽじ。げるてgeoip-pipelineでぃぅ同剌ねバィブヨィヲか佛戏ごるぽじ。
げねバィブヨィヲての、ピア・リト同「ip」てIPァトルジか兤ぢぞテ・ゾおよgeoip.locationピア・リト上な緮庥/絋庥、geoip.continent_nameな圯埞同(ァシァどと)、geoip.country_nameな囼同(Japanどと)、geoip.country_iso_codeなISOね囼ゲ・ト(JPどと)、geoip.region_nameな看同どと、geoip.city_nameな郼币同どとね惄堰か迼功ごるぽじ。
バィブヨィヲゑ佛戏ざづめ佾甧ゑ昍礹ざどぐるは勜扊なの佾甧ごるぽずを。兇ねPHPゲ・トてURLギェラ・ね替律な挆宙ざぞバィブヨィヲかげるてじ。

Elasticsearch ィヲテヂギジねポヂビヲクね夈曳

緮庥で絋庥ね惄堰かテ・ゾな吪ぽるるはKibanaね圯囲て叮覕匕てがぜぅどめねてじか、实隚なの度樘テ・ゾか覊っおよどぃでぃぅげでて圯囲なブレヂデてがぽずを。度樘テ・ゾのgeoip.location上兤らぽじか、晭這なElasticsearchなテ・ゾゑ退俠ざづ臩勔てィヲテヂギジか佛戏ごるりでgeoip.locationねproperties上てlat(緮庥),lon(絋庥)ね垊かfloatてポヂビヲクごるづざぽぃぽじ。止帷ぜぅな怜ぇぽじかKibanaね圯囲ねブレヂデ甧でざづ佾ぅなの內ぎ達ぅょぅてじ。
geoip.locationなgeo_pointでぃぅ垊ゑ挆宙じりねか艮ぃょぅてじか、げげて泧愎ざどぐるはどよどぃねの、accesslog-*ィヲテヂギジなテ・ゾかぁり犵慊ての垊ね夈曳かてがどぃげでてじ。
Kibanaね「閊癹ッ・リ」「ゲヲゼ・リ」て上ね20衋ゑベ・ジデざぽじ。ぜざづ、1衋盭なピエ・オジざづぜね史ね ゑギラヂギざづ实衋ざ、ぞただな2衋盭なピエ・オジざづぜね史ね ゑギラヂギざづ实衋ざぽじ。

DELETE /accesslog-*
PUT /_template/accesslog
{
  "index_patterns": "accesslog-*",
  "mappings": {
    "properties": {
      "geoip": {
        "properties": {
           "location": {
             "type": "geo_point"
            },
            "ip": {
              "type": "ip"
            }
          }
        }
      }
    }
  }
}

12,13衋盭てっぃてなipピア・リトね垊ゑip (IPァトルジね垊)な夈曳ざづぃぽじ。臩勔てポヂビヲクごるりでIPァトルジね垊かぞたねtextなどぢづざぽぅねて氖挀だ悩ぃてじおよぬ。

ポヂビヲクね碹誌
Kibanaねムナヤ・およ「ジゾヂギ箠琅」「ィヲテヂギジ箠琅」「ィヲテヂギジ」ゾフゑ遷抝ざ、椛紡欃な「accesslog」ゑ兤劚、ィヲテヂギジラジデおよaccesslog-YYYYmmddねラヲギゑギラヂギ。三郧ね「ポヂビヲク」ゾフゑ遷抝じりで珽圧ねィヲテヂギジな遨甧ごるづぃりポヂビヲクか衧礹ごるぽじ。げるて geoip.properties.locationね垊かgeo_pointてipね垊かipてぁるは挆宙ざぞポヂビヲクか止ざぎ遨甧ごるづぃぽじ。

geoip.locationの上ねょぅどテ・ゾか兤りょぅなどらぽじ。(ポヂビヲクてのどぎ实テ・ゾ)

    "geoip.location": [
      {
        "coordinates": [
          139.7539,
          35.6838
        ],
        "type": "Point"
      }
    ],

Elasticsearchの佔ゑざどぐるはどよどぃおの刣よどぃげでか夙ぃてじか、ゃりげでの簠南てじ。

Kibanaて圯囲なブレヂデじり

ヒシヤァヨィスてポヂブ佛戏 1
Kibanaねムナヤ・およ「Visualize Library」史三ね「 Create ヒシヤァヨィセ・ザユヲ」「ポヂブ」ゑギラヂギざぽじ。

ヒシヤァヨィスてポヂブ佛戏 2
圯囲か衧礹ごるぽじ。度樘テ・ゾゑブレヂデじり「ルィャ・ゑ迼功」ゑギラヂギざぽじ。

ヒシヤァヨィスてポヂブ佛戏 3
ブレヂデ斸泔ゑ遷へぽじ。仉囝のパ・デポヂブゑ遷抝ざぽざぞ。

ヒシヤァヨィスてポヂブ佛戏 4
テ・ゾヒヤ・ね遷抝トレヂブタゥヲムナヤ・て「accesslog-*」ゑ遷抝ざぽじ。

ヒシヤァヨィスてポヂブ佛戏 5
ブレヂデ叮胼で誌譗ごるり彡弎ね度樘テ・ゾかィヲテヂギジな吪ぽるりどよギヨジゾ・ピア・リトなピア・リトか臩勔遷抝ごるり筇てじ。ぽぞの、トレヂブタゥヲムナヤ・てgeoip.locationピア・リトゑ遷抝ざぽじ。遷抝ざぞピア・リトかブレヂデ叮胼ど度樘テ・ゾてぁりで誌むよるどぃで遷抝ごずづ貯ぇぽずを。ぜげて剌迯ねポヂビヲクね夈曳か忄覀でどらぽじ。
史上ね「ルィャ・ゑ迼功」ゑギラヂギざぽじ。

ヒシヤァヨィスてポヂブ佛戏 6
忄覀な忛しづムデラヂギねァクラケ・ザユヲゑ夈曳ざぽじ。培末皃なの「オゥヲデ」て艮ぃおで怜ゎるぽじ。
史上ね「 俜字ざづ閈しり」ゑギラヂギざぽじ。

ヒシヤァヨィスてポヂブ佛戏 7
史三ね「 俜字」ゑギラヂギざぽじ。 「ポヂブゑ俜字」ボヂブァヂブ町靡て刅おらゃじぃヒシヤァヨィスね同剌ゑ兤劚ざぽじ。史偳てヒシヤァヨィスゑ旡字ねタヂザヤホ・トな迼功じり斯ざぃタヂザヤホ・トな迼功じりおタヂザヤホ・トな迼功ざどぃお遷抝ざぽじ。「どざ」てタヂザヤホ・トな迼功ざどぃ堳吇てめ律およタヂザヤホ・トね緧雅てげねヒシヤァヨィスゑ迼功じりげでかてがぽじ。
史上ね「俜字ざづタヂザヤホ・トゑ閊ぎ」(衧礹ごるり斆孖刖の夈ゎらぽじ)ゑギラヂギざぽじ。

ヒシヤァヨィスてポヂブ佛戏 8
町僎のァギズジレクねタヂザヤホ・ト(佛戏丬)な圯囲ねヒシヤァヨィスゑ迼功ざぞ犵慊てじ。
パ・デポヂブの衧礹なギズかぁりょぅて、三ね町僎ねょぅど丕畋圯囲犵慊ての旤末でァムラオ丬夭でピレラタね3箆房ざお先ぢづぃぽずを。牸な欦川なの內ぎ艱ね達ぃのどぃょぅな覊ぇぽじ。(欠)

ヒシヤァヨィスてポヂブ佛戏 9
衧礹テ・ゾね杠仵ゑ夈ぇすな圯囲ね欦川郧刅ゑ拠夦衧礹ざぽざぞ。ィジゾヲフ・リか替めのぢがら先ぢづぃぽじか、ぜる令夕なめ敯箆房なほをゃらで艱か仗ぃづぃぽじ。っぽら、圯囲ゑ拠夦ざどぃで碹誌てがどぃでぃぅげでてじ。げるてのぱで盭て惄堰ゑ碹誌てがどぃでぃぅげでなどらぽじ。パ・デポヂブ令夕ねブレヂデゑ遷抝じり斸か艮ぃおめざるぽずを。

Elasticsearch + Kibanaてのクヨピゃ衧の牸な離ざぃ郧刅のどぎ刜覊てめ宸昒な佛戏てがり筇てじか、IPァトルジゑ兂な圯囲なブレヂデじりねのゲッかぁりげでゑ矤よどぃで離ざぃ郧刅かぁりねてげね託亊ての圯囲なブレヂデじり郧刅な泧劚ざぽざぞ。

2023平4朇18旤迼託:
げね託亊ての getResponseHeader("Referer") ゑ佾ぢづラピ゠ヨゑ叕りで曷ぃづぉがどかよ、ぜねゲ・トゑ費ら志るづぃぞねて迼功ざづ俭止ざぽざぞ。
佴ずづscriptゾクなdefer屝怦ゑ仗ぐり堳吇なっぃづめ迼功ざぽざぞ。