PageSourceSearch

https://phishscan.io/assets/BenchmarkView-Bzi9oVuo.js

js phishscan.io collected 2026-10-02 01:58:19 UTC 11,610 bytes, 1 lines download raw bytes

1import{u as C,C as F,c as n,d as b,a as e,t as s,F as h,e as P,E as f,f as p,p as y,w as M,b as O,R as D,r as B,k as m,o as i}from"./vendor-DcWJ6w6z.js";import{b as U}from"./index-CCKdGX-m.js";import{N as $,_ as j}from"./FooterSection-rWdslapY.js";import{u as A}from"./useSeo-DIGXrsw8.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const q={class:"dark-page min-h-screen flex flex-col"},E={class:"flex-1 pt-16"},I={class:"max-w-3xl mx-auto px-4 py-12"},W={class:"text-center mb-10"},z={class:"text-3xl sm:text-4xl font-bold",style:{color:"#f0f4ff"}},G={class:"text-sm mt-3 max-w-xl mx-auto",style:{color:"#8899bb"}},H={key:0,class:"text-center text-sm",style:{color:"#8899bb"}},J={key:1,class:"rounded-2xl p-8 text-center",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},K={class:"text-sm",style:{color:"#8899bb"}},Q={class:"grid sm:grid-cols-2 gap-3 mb-3"},X={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Y={class:"text-[11px] uppercase tracking-widest mb-1",style:{color:"#60a5fa"}},Z={class:"text-3xl font-bold",style:{color:"#34d399"}},ee={class:"text-[12px] mt-1",style:{color:"#8899bb"}},se={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},te={class:"text-[11px] uppercase tracking-widest mb-1",style:{color:"#60a5fa"}},oe={class:"ml-1 lowercase tracking-normal",style:{color:"#7f8fb3"}},ae={class:"text-[12px] mt-1",style:{color:"#8899bb"}},le={key:0,class:"rounded-2xl p-5 mb-3",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},ne={class:"text-[13px] mb-3",style:{color:"#cdd6f4"}},ie={class:"space-y-3"},ce={class:"flex justify-between text-[12px] mb-1"},re={style:{color:"#8899bb"}},de={style:{color:"#cdd6f4"}},ue={class:"h-2 rounded-full overflow-hidden",style:{background:"#0f1424"}},pe={class:"flex justify-between text-[12px] mb-1"},he={style:{color:"#8899bb"}},_e={style:{color:"#cdd6f4"}},fe={class:"h-2 rounded-full overflow-hidden",style:{background:"#0f1424"}},me={class:"text-[12px] mt-3",style:{color:"#7f8fb3"}},xe={key:1,class:"rounded-2xl p-5 mb-3",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},be={class:"flex items-center justify-between mb-2"},ye={class:"text-[13px]",style:{color:"#cdd6f4"}},ve={class:"flex gap-3 text-[11px]"},ge={style:{color:"#34d399"}},ke={style:{color:"#f87171"}},we=["viewBox"],Te=["points"],Pe=["points"],Be={class:"text-[11px] mt-1",style:{color:"#7f8fb3"}},Le={key:2,class:"grid sm:grid-cols-2 gap-3 mb-3"},Ne={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Se={class:"text-[12px] font-semibold mb-2",style:{color:"#f87171"}},Ve={class:"space-y-1.5"},Re={class:"font-mono break-all",style:{color:"#cdd6f4"}},Ce={key:0,class:"text-[11px] ml-1",style:{color:"#8899bb"}},Fe={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Me={class:"text-[12px] font-semibold mb-2",style:{color:"#34d399"}},Oe={class:"flex flex-wrap gap-1.5"},De={class:"text-[12px] font-semibold mt-4 mb-1",style:{color:"#d97706"}},Ue={class:"space-y-1"},$e={class:"font-mono",style:{color:"#cdd6f4"}},je={key:0,style:{color:"#8899bb"}},Ae={class:"text-[12px] mb-8",style:{color:"#7f8fb3"}},qe={class:"rounded-2xl p-6",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Ee={class:"text-base font-bold mb-3",style:{color:"#f0f4ff"}},Ie={class:"space-y-2.5 text-[13.5px]",style:{color:"#8899bb"}},We={class:"flex gap-2"},ze={class:"flex gap-2"},Ge={class:"flex gap-2"},He={class:"text-center mt-10"},L=600,x=90,es={__name:"BenchmarkView",setup(Je){const{locale:v}=C(),t=(o,a)=>v.value==="uk"?o:a;A("benchmark","/benchmark");const l=B(null),g=B(!0),d=m(()=>{var o;return((o=l.value)==null?void 0:o.detail)||null}),u=m(()=>{var o;return((o=d.value)==null?void 0:o.examples)||null}),_=m(()=>{var o;return(((o=l.value)==null?void 0:o.history)||[]).filter(a=>a.recall_pct!=null&&a.fpr_pct!=null)}),N=m(()=>{var a;const o=Number(((a=l.value)==null?void 0:a.fpr_pct)??0);return o<=1?"#34d399":o<=3?"#d97706":"#f87171"});function k(o){return Math.round(Number(o)*10)/10}function w(o,a){return a?Math.round(100*o/a):0}function S(o){try{return new Date(o).toLocaleDateString(v.value==="uk"?"uk-UA":"en-US",{dateStyle:"medium"})}catch{return o}}function T(o){const a=o.length;return a<2?"":o.map((c,r)=>{const V=r/(a-1)*L,R=x-Math.max(0,Math.min(100,Number(c)))/100*x;return`${V.toFixed(1)},${R.toFixed(1)}`}).join(" ")}return F(async()=>{try{l.value=(await U.get("/api/tools/benchmark")).data}catch{l.value=null}g.value=!1}),(o,a)=>(i(),n("div",q,[b($),e("div",E,[e("div",I,[e("div",W,[e("h1",z,s(t("Бенчмарк виявлення","Detection benchmark")),1),e("p",G,s(t("Замість заяв про «точність» — відтворюваний щотижневий замір на реальних даних: свіжий фішинг проти топ-легітимних доменів.","Instead of an “accuracy” claim — a reproducible weekly measurement on real data: fresh phishing vs. top legitimate domains.")),1)]),g.value?(i(),n("div",H,s(t("Завантаження…","Loading…")),1)):!l.value||l.value.available===!1?(i(),n("div",J,[e("p",K,s(t("Перший прогін ще готується — зайдіть згодом.","The first run is being prepared — check back soon.")),1)])):(i(),n(h,{key:2},[e("div",Q,[e("div",X,[e("p",Y,s(t("Виявлено фішингу","Phishing detected")),1),e("p",Z,s(k(l.value.recall_pct))+"%",1),e("p",ee,
1s(l.value.detected)+"/"+s(l.value.positive_n)+" "+s(t("свіжих фішингових URL (OpenPhish)","fresh phishing URLs (OpenPhish)")),1)]),e("div",se,[e("p",te,[P(s(t("Хибні спрацювання","False-positive rate"))+" ",1),e("span",oe,"· "+s(t("головна метрика","the metric that matters")),1)]),e("p",{class:"text-3xl font-bold",style:f({color:N.value})},s(k(l.value.fpr_pct))+"%",5),e("p",ae,s(l.value.false_positives)+"/"+s(l.value.negative_n)+" "+s(t("топ-легітимних доменів (Tranco)","top legitimate domains (Tranco)")),1)])]),d.value?(i(),n("div",le,[e("p",ne,s(t("З чого складається виявлення","What the detection is made of")),1),e("div",ie,[e("div",null,[e("div",ce,[e("span",re,s(t("Вже у зовнішніх базах (VirusTotal / Safe Browsing / PhishTank)","Already in external DBs (VirusTotal / Safe Browsing / PhishTank)")),1),e("span",de,s(d.value.external_n)+"/"+s(l.value.detected),1)]),e("div",ue,[e("div",{class:"h-full",style:f({width:w(d.value.external_n,l.value.detected)+"%",background:"#60a5fa"})},null,4)])]),e("div",null,[e("div",pe,[e("span",he,s(t("Спіймав наш незалежний сигнал (вік домену, імітація бренду)","Caught by our own signal (domain age, brand impersonation)")),1),e("span",_e,s(d.value.own_n)+"/"+s(l.value.detected),1)]),e("div",fe,[e("div",{class:"h-full",style:f({width:w(d.value.own_n,l.value.detected)+"%",background:"#34d399"})},null,4)])])]),e("p",me,s(t("Більшість відомого фішингу вже є у великих базах — ми перевіряємо їх усі в одному запиті. Складніше не «кричати вовк»: саме тому головна цифра — хибні спрацювання.","Most known phishing is already in the big databases — we query them all in one request. The hard part is not crying wolf: that’s why the headline number is the false-positive rate.")),1)])):p("",!0),_.value.length>=2?(i(),n("div",xe,[e("div",be,[e("p",ye,s(t("Динаміка прогонів","Runs over time")),1),e("div",ve,[e("span",ge,"● "+s(t("виявлення","detection")),1),e("span",ke,"● "+s(t("хибні","false-pos")),1)])]),(i(),n("svg",{viewBox:`0 0 ${L} ${x}`,class:"w-full",style:f({height:x+"px"}),preserveAspectRatio:"none"},[e("polyline",{points:T(_.value.map(c=>c.recall_pct)),fill:"none",stroke:"#34d399","stroke-width":"2"},null,8,Te),e("polyline",{points:T(_.value.map(c=>c.fpr_pct)),fill:"none",stroke:"#f87171","stroke-width":"2"},null,8,Pe)],12,we)),e("p",Be,s(_.value.length)+" "+s(t("останніх прогонів","latest runs"))+" · "+s(t("шкала 0–100%","0–100% scale")),1)])):p("",!0),u.value?(i(),n("div",Le,[e("div",Ne,[e("p",Se,s(t("Спіймано в цьому прогоні","Caught in this run")),1),e("ul",Ve,[(i(!0),n(h,null,y(u.value.caught,(c,r)=>(i(),n("li",{key:r,class:"text-[12px]"},[e("span",Re,s(c.url),1),c.reason?(i(),n("span",Ce,"· "+s(c.reason),1)):p("",!0)]))),128))])]),e("div",Fe,[e("p",Me,s(t("Легітимні — не помічені","Legitimate — not flagged")),1),e("div",Oe,[(i(!0),n(h,null,y(u.value.clean,(c,r)=>(i(),n("span",{key:r,class:"text-[11px] font-mono px-2 py-0.5 rounded-full",style:{background:"#0f1424",color:"#8899bb"}},s(c),1))),128))]),u.value.false_pos&&u.value.false_pos.length?(i(),n(h,{key:0},[e("p",De,s(t("Хибні спрацювання (чесно)","False positives (shown honestly)")),1),e("ul",Ue,[(i(!0),n(h,null,y(u.value.false_pos,(c,r)=>(i(),n("li",{key:r,class:"text-[11px]"},[e("span",$e,s(c.domain),1),c.reason?(i(),n("span",je," · "+s(c.reason),1)):p("",!0)]))),128))])],64)):p("",!0)])])):p("",!0),e("p",Ae,s(t("Останній прогін","Last run"))+": "+s(S(l.value.ran_at))+" · "+s(t("оновлюється щотижня, автоматично","updated weekly, automatically")),1),e("div",qe,[e("h2",Ee,s(t("Методика","Method")),1),e("ul",Ie,[e("li",We,[a[0]||(a[0]=e("span",{style:{color:"#60a5fa"}},"•",-1)),e("span",null,s(t("Позитивний набір — свіжі фішингові URL з OpenPhish. Негативний — топ-легітимні домени з Tranco top-list. Вибірка стабільна в межах тижня (детермінований seed).","Positive set: fresh phishing URLs from OpenPhish. Negative set: top legitimate domains from the Tranco list. The sample is stable within a week (deterministic seed).")),1)]),e("li",ze,[a[1]||(a[1]=e("span",{style:{color:"#60a5fa"}},"•",-1)),e("span",null,s(t("Прогоняємо той самий репутаційний шар, що й на реальній перевірці: VirusTotal + Safe Browsing + PhishTank + вік домену + імітація бренду. Наші власні блоклисти тут вимкнено — інакше фішинг з OpenPhish зараховувався б сам собі.","We run the same reputation layer a real check uses: VirusTotal + Safe Browsing + PhishTank + domain age + brand impersonation. Our own blocklists are disabled here — otherwise OpenPhish phishing would count itself.")),1)]),e("li",Ge,[a[2]||(a[2]=e("span",{style:{color:"#60a5fa"}},"•",-1)),e("span",null,s(t("Домен вважається поміченим, якщо risk ≥ 50 (рівень «підозріло»). Хибні спрацювання — головна метрика: помилка на чужому добропорядочному домені дорожча за пропуск.","A domain counts as flagged if its risk ≥ 50 (the “suspicious” level). False positives are the headline metric — a mistake on someone’s legitimate domain costs more than a miss.")),1)])])]),e("div",He,[b(O(D),{to:"/",class:"rounded-xl px-6 py-3 text-sm font-semibold inline-block",style:{background:"#2563eb",color:"#fff"}},{default:M(()=>[P(s(t("Перевірити своє посилання","Check your own link"))+" → ",1)]),_:1})])],64))])]),b(j)]))}};export{es as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.