26.5.4 Webhook és callback kezelők

2025.10.06.
AI Biztonság Blog

Az eseményvezérelt automatizálás egyik alappillére, hogy rendszereink nem folyamatosan kérdezgetik egymást, hanem szólnak, ha valami lényeges történt. A webhookok pontosan ezt a „ne hívj, majd én hívlak” elvet valósítják meg. Ahelyett, hogy egy API-t másodpercenként lekérdeznénk egy hosszúra nyúló feladat (pl. egy komplex modellanalízis) állapotáról, inkább megadunk egy visszahívási URL-t (callback URL), ahová a szolgáltatás egy HTTP POST kérést küld, amint végzett.

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

Ez a megközelítés drasztikusan csökkenti a felesleges hálózati forgalmat és az erőforrás-terhelést mindkét oldalon. Egy Red Teaming pipeline-ban ez kulcsfontosságú, ahol akár több ezer tesztesetet futtatunk párhuzamosan külső vagy belső elemző szolgáltatásokon keresztül.

Polling vs. Webhook: Két világ

A különbség megértéséhez érdemes összevetni a két módszert. A polling (folyamatos lekérdezés) olyan, mintha folyamatosan azt kérdeznéd: „Kész van már?”. A webhook ezzel szemben egy értesítés: „Elkészültem, itt az eredmény.”

Aspektus Polling (Lekérdezés) Webhook (Visszahívás)
Kommunikáció iránya A kliens kezdeményez (Client Pull) A szerver kezdeményez (Server Push)
Erőforrás-használat Magas, sok felesleges kéréssel Alacsony, csak esemény bekövetkeztekor történik kommunikáció
Adatfrissesség Késleltetett, a lekérdezési intervallumtól függ Azonnali, valós idejű
Komplexitás Kliens oldalon egyszerűbb, de állapotkövetést igényelhet Kliens oldalon egy fogadó végpontot (listener) kell implementálni
Tipikus Red Team példa Egy prompt-injekciós teszt eredményének lekérdezése percenként A tesztelő rendszer értesítést kap, amint a jailbreak detektor befejezte az elemzést

Egy tipikus webhook folyamat az AI Red Teamingben

Képzelj el egy automatizált rendszert, ami egy LLM kimenetét küldi el egy külső sebezhetőség-elemző szolgáltatásnak. A folyamat a következőképpen nézne ki:

Red Team Eszköz Elemző Szolgáltatás Webhook Kezelő 1. POST /analyze (payload, callback_url) 2. 202 Accepted (job_id: „xyz123”) Aszinkron feldolgozás… 3. POST /webhook (eredmény payload) Validálás & mentés 4. 200 OK

Biztonsági megfontolások: A bizalom ára

Egy webhook kezelő lényegében egy nyitott ajtó a rendszered felé. Bárki, aki ismeri az URL-t, küldhet rá adatokat. Ezért a hitelesítés elengedhetetlen. Soha ne bízz meg vakon a bejövő adatokban!

  • Payload hitelesítés (Signature Verification): A leggyakoribb módszer. A küldő fél egy megosztott titkos kulccsal aláírja a kérés törzsét (pl. HMAC-SHA256 algoritmussal), és az eredményt egy HTTP fejlécben (pl. X-Hub-Signature-256) elküldi. A fogadó oldalon neked is el kell végezned ugyanezt a számítást, és összevetni az eredményt a kapott fejléccel. Ha nem egyeznek, a kérést el kell dobni.
  • Időbélyeg ellenőrzés: A replay attack (visszajátszásos támadás) kivédésére a kérés tartalmazhat egy időbélyeget. Ha a kérés túl „régi” (pl. 5 percnél régebbi), elutasíthatod.
  • Forrás IP-cím szűrés: Ha a küldő szolgáltatás ismert, fix IP-címekről kommunikál, érdemes lehet a tűzfalon csak ezeket engedélyezni.
  • HTTPS használata: Ez alapvető. Mindig titkosított csatornán kommunikálj, hogy megvédd az adatokat a lehallgatástól (man-in-the-middle).

Gyakorlati implementáció

Nézzünk egy egyszerű Python példát egy webhook kezelő implementálására a Flask keretrendszer segítségével, fókuszálva a payload hitelesítésére.

1. A fogadó végpont (Listener) létrehozása

Ez a minimális kód, ami fogadja a POST kéréseket egy adott útvonalon.

from flask import Flask, request, jsonify

app = Flask(__name__)

# A mi titkos kulcsunk, amit az elemző szolgáltatás is ismer.
# Ezt soha ne égesd bele a kódba, használd környezeti változókból!
SHARED_SECRET = 'nagyon-biztonsagos-kulcs-123'

@app.route('/webhook-receiver', methods=['POST'])
def handle_webhook():
 # Először is, ellenőrizzük a kérés hitelességét
 if not is_signature_valid(request):
 return 'Invalid signature', 403

 # Ha a hitelesítés sikeres, feldolgozzuk az adatokat
 data = request.get_json()
 print(f"Érvényes webhook érkezett: {data}")
 
 # Itt jönne a logika: adatbázisba mentés, riasztás küldése, stb.
 # ...

 # Fontos, hogy jelezzük a küldőnek a sikeres fogadást
 return jsonify({'status': 'success'}), 200

if __name__ == '__main__':
 app.run(port=5001)
 

2. A payload hitelesítése (Signature Verification)

A fenti kódban hivatkozott is_signature_valid függvény kulcsfontosságú. Ez végzi a tényleges biztonsági ellenőrzést.

import hmac
import hashlib

def is_signature_valid(req):
 # Lekérjük a fejlécből a küldött aláírást
 # A 'sha256=' prefix gyakori, ezt le kell vágni
 signature_header = req.headers.get('X-Hub-Signature-256', '').replace('sha256=', '')
 if not signature_header:
 return False

 # Lekérjük a kérés nyers törzsét (body)
 payload_body = req.get_data()

 # Legeneráljuk a saját HMAC aláírásunkat a payloadból és a titkos kulcsból
 h = hmac.new(SHARED_SECRET.encode('utf-8'), payload_body, hashlib.sha256)
 expected_signature = h.hexdigest()

 # Összehasonlítjuk a kettőt. A hmac.compare_digest biztonságos
 # az időzítéses támadásokkal szemben.
 return hmac.compare_digest(signature_header, expected_signature)
 

Ez a két kódrészlet együttesen egy robusztus és biztonságos alapot ad a webhookok fogadására az automatizált Red Teaming munkafolyamataidban. A lényeg, hogy a fogadott adatot mindig kezeld potenciális fenyegetésként, amíg annak hitelességéről meg nem győződtél.