API-reference

JavaScript
import SpamScanner from 'spamscanner';             // ESM
const SpamScanner = require('spamscanner');        // CommonJS

const scanner = new SpamScanner(options);
const result = await scanner.scan(rawMessage, scanOptions);

Opret én scanner, og genbrug den: den indlæser modellen én gang og cacher svar fra DNS og sprogmodeller.

Indstillinger#

Alle indstillinger kan gives til konstruktøren. De fleste kan også gives til scan() for en enkelt besked, og de flettes da oven på konstruktørens.

IndstillingStandardBetydning
threshold5Score, hvor en besked er spam
rejectThreshold15Score, hvor action er reject
scores{}Point pr. test: indstillingsnøgler eller testnavne (test og scorer)
classifiermedfølgende modelEn Classifier, et modelobjekt, en sti til en modelfil eller false
classifierOptions{}Indstillinger for den medfølgende model (se Classifier)
allowedLanguages[]ISO 639-1-koder; andre sprog får LANGUAGE_NOT_ALLOWED
phishing.cloudflaretrueSpørg Cloudflares filtrerende resolvere om værter i links
phishing.adulttrueSpørg også familieresolveren, som blokerer voksenwebsteder
phishing.maxHosts25Værter i links, der slås op pr. besked
phishing.homograph{}brands (erstatter den indbyggede liste), extraBrands, allowlist (domæner, der aldrig markeres), strictMode
dnsbl{ip: [], domain: []}DNS-blokeringslistezoner for klientens IP og for domæner i links
dns{servers: null, timeout: 3000}Navneservere til DNS-tjek (standard: systemets)
attachmentstrueUndersøg vedhæftede filer
macrostrueMarkér makroer, aktive PDF'er og RTF-objekter
arbitrarytrueKør reglerne
authenticationfalsetrue eller {dnsServers, timeout, mta, weights}: SPF, DKIM, DMARC, ARC
reputationfalse{allowlist, denylist, apiUrl, headers, timeout}
allowlist, denylistIP-adresser, domæner eller adresser; kortform for reputation
clamavfalsetrue (standardsocket), {socket} eller {host, port}
llmnullIndstillinger for sprogmodellen med mode, minScore, maxScore
toxicityfalse{model, threshold = 0.7}: en model, hvis classify([text]) svarer som @tensorflow-models/toxicity
nsfwfalse{model, threshold = 0.6}: en model, hvis classify(imageBuffer) svarer som nsfwjs
maxLength100000Antal tegn af brødteksten, der læses
timeout10000Millisekunder, der er tilladt for hvert netværkstjek
session{}Standardoplysninger om SMTP-sessionen

scan() tager også session:

JavaScript
await scanner.scan(raw, {
  session: {
    remoteAddress: '203.0.113.5',             // the client's IP address
    resolvedClientHostname: 'mx.example.com', // its verified reverse DNS name
    helo: 'mx.example.com',
    envelope: {
      mailFrom: {address: 'alice@example.com'},
      rcptTo: [{address: 'bob@example.org'}],
    },
  },
});

En server, der allerede har tjekket SPFSender Policy Framework: en DNS-post, der angiver de servere, som må sende post for et domæne., DKIMDomainKeys Identified Mail: en signatur over en besked, der tjekkes med en offentlig nøgle, som er offentliggjort i afsenderens DNS., DMARCEn DNS-politik, der fortæller modtagere, hvad de skal gøre, når post, der udgiver sig for at komme fra et domæne, ikke består SPF- og DKIM-justeringen. og ARCAuthenticated Received Chain: signaturer, der bærer godkendelsesresultater videre gennem videresendende servere. (med mailauth), kan give sine resultater videre som authenticationResults, og så scores de i stedet for at blive tjekket igen:

JavaScript
import {authenticate} from 'mailauth';

const auth = await authenticate(raw, {ip, helo, sender, mta});
await scanner.scan(raw, {authenticationResults: auth});

Metoder#

MetodeReturnerer
scan(source, options)Resultatet. source er en Buffer, en streng, et Uint8Array eller en læsbar stream
scanFile(path, options)Resultatet for en beskedfil
learn(source, 'spam' | 'ham')Lærer klassifikatoren én besked
unlearn(source, 'spam' | 'ham')Fortryder learn
saveModel(path, options)Skriver klassifikatoren til en fil (options: minCount, maxFeatures, metadata)
getClassifier()Den Classifier, der er i brug, eller null
getClassification(features)Klassifikatorens dom for features fra getFeatures
getFeatures(mail){features, words, language, script, links, hosts, text, hidden} for en besked
getTokens(text, locale)Ordene i en tekst
getTokensAndMailFromSource(source){tokens, features, mail}
parse(source){raw, mail}, med mail fra mailparser

I getFeatures er text den tekst, en mailklient viser, og som ordene læses fra, og hidden hvor mange tegn tekst HTML'en skjuler.

scanner.metrics indeholder totalScans, averageTime og lastScanTime.

Resultatet#

JavaScript
{
  isSpam: true,
  score: 16.25,
  threshold: 5,
  rejectThreshold: 15,
  action: 'reject',                       // 'accept', 'tag' or 'reject'
  message: 'Spam (BAYES_999, PHISHING_LOOKALIKE_DOMAIN, DECEPTIVE_LINK, FROM_NAME_BRAND)',
  tests: [
    {name: 'BAYES_999', score: 6.25, description: 'Classifier spam probability 99.9%'},
    {name: 'PHISHING_LOOKALIKE_DOMAIN', score: 5, description: '"paypa1-secure.top" imitates paypal by swapping characters'},
    // ...
  ],
  results: {
    classification: {probability, category, spam, ham, clues, coverage},
    phishing: [],        // lookalike domains, deceptive links, Cloudflare and URIBL findings
    uncheckedHosts: 0,   // link hosts beyond phishing.maxHosts, not looked up
    attachments: [],     // every attachment finding
    executables: [],     // the executable findings among them
    macros: [],          // macros, active PDFs, RTF objects
    viruses: [],         // ClamAV findings: {filename, virus: [names], message}
    arbitrary: [],       // rules strong enough to mark spam alone
    obfuscation: {invisible, mixed, styled},
    authentication: null, // mailauth's results with a score, when checked
    reputation: null,
    dnsbl: [],           // {zone, value} for each listing
    language: {language, script, notAllowed},
    llm: null,           // the language model's verdict, when asked
    toxicity: [],
    nsfw: [],
    idnHomographAttack: {detected, domains, riskScore},
  },
  links: ['http://paypa1-secure.top/login'],
  language: 'en',
  tokens: ['dear', 'customer', /* ... */],
  mail: {/* the parsed message, from mailparser */},
  version: '7.0.0',
  metrics: {totalTime: 42},
}

Fund i phishing, attachments, executables, macros, viruses og arbitrary er objekter med en type og en message. String(finding) er beskeden.

Eksporter#

JavaScript
import SpamScanner, {
  Classifier, getFeatures, segmentWords, detectLanguage,
  LLMClassifier, PROVIDERS, RECOMMENDED_MODELS, CLASSIFIER_MODELS,
  DEFAULT_SCORES, scoreResults, spamHeaders, rewriteMessage,
  loadModel, saveModel, defaultModelPath, loadDefaultModel,
  train, evaluate, readExamples,
  MilterServer, createHttpServer, createTcpServer, createSpamdServer,
  DEFAULTS, VERSION,
} from 'spamscanner';

import ArfParser from 'spamscanner/arf';

Classifier#

JavaScript
const classifier = new Classifier({spamCutoff: 0.99, hamCutoff: 0.2});
classifier.learn(getFeatures(mail).features, 'spam');
classifier.classify(features); // {probability, category, spam, ham, clues, coverage}
IndstillingStandardBetydning
strength, unknown0.45, 0.5Robinsons s og x: hvor kraftigt sjældne features trækkes mod 0,5
minDistance0.1Features, der ligger tættere på 0,5 end dette, ignoreres
maxClues150De stærkeste features, der kombineres pr. besked
hamCutoff, spamCutoff0.2, 0.99Grænserne for unsure-intervallet
minLanguageExamples, languageShare1000, 0.02Beskeder af hver klasse, der kræves på et sprog for fuld sikkerhed
languagePriortrueVej ord mod tallene for deres eget sprog

merge(other), toJSON(options), Classifier.fromJSON(json), size og entries() er også tilgængelige.

Træning#

JavaScript
import {train, evaluate, saveModel} from 'spamscanner';

const {classifier, spam, ham} = await train({
  spam: ['/mail/Junk'],
  ham: ['/mail/Archive', '/mail/archive.mbox'],
  datasets: [{file: 'extra.csv', textColumn: 'body', labelColumn: 'kind'}],
});
saveModel(classifier, 'model.json');

evaluate(classifier, examples) tager {label, features}-elementer eller readExamples(sources), som læser de samme kilder som train, og returnerer optællinger, præcision, genkaldelse, F1, nøjagtighed samt andelen af falske positiver, falske negativer og usikre.

Servere#

JavaScript
import SpamScanner, {MilterServer, createHttpServer, createSpamdServer} from 'spamscanner';

const scanner = new SpamScanner({authentication: true});
const milter = new MilterServer(scanner, {reject: true, rejectCode: 451, subjectTag: '[SPAM]'});
milter.on('scan', ({session, result}) => console.log(session.remoteAddress, result.score));
await milter.listen(7831);

createHttpServer(scanner, {token: process.env.SPAMSCANNER_TOKEN}).listen(7832, '127.0.0.1');
createSpamdServer(scanner).listen(783, '127.0.0.1');

ARF-rapporter#

spamscanner/arf læser og skriver rapporter om misbrugsfeedback (RFC 5965), det format, som postkasseudbydere bruger til at indberette spamklager:

JavaScript
import ArfParser from 'spamscanner/arf';

const report = await ArfParser.parse(rawReport);
console.log(report.feedbackType, report.sourceIp, report.originalHeaders.subject);

const raw = ArfParser.create({
  feedbackType: 'abuse', userAgent: 'MyService/1.0',
  from: 'abuse@example.com', to: 'fbl@example.net',
  originalMessage, sourceIp: '192.0.2.1',
});

ArfParser.tryParse() returnerer null i stedet for at kaste en fejl for beskeder, der ikke er rapporter, og isArfMessage(mail) tjekker en fortolket besked.

Redigér denne side på GitHub · Markdown ·