Anti-Flood-System für Clients und ClientQuery in TeamSpeak 3

Dieses Dokument beschreibt das Anti-Flood-System für virtuelle Server. Es betrifft ausschließlich Voice-Clients, sowohl bei der normalen Verwendung als auch bei ClientQuery. Der in Client-Version 3.0.9 entfernte Voice-Client-ServerQuery (unten in der Tabelle als serverquerycmd geführt) erhielt unabhängig vom konkreten Befehl pauschal 5 Punkte pro Befehl. Dieses Feature wurde inzwischen entfernt, ansonsten gilt die hier genannte Liste höchstwahrscheinlich unverändert von 3.0.2 bis heute. Sie wurde vom 29. bis 31. Oktober 2017 mit den Server-Versionen 3.0.6.1-final und 3.0.13.8 erstellt.

ServerQuery-Clients sind vom hier beschriebenen Anti-Flood nicht betroffen. Sie leiden ja auch genug unter dem Instanz-Anti-Flood, das pauschal einen Punkt pro Befehl gibt.

Allgemeines

Ein Client startet mit 0 Punkten. Jede halbe Sekunde (genannt „Tick“) bekommt man virtualserver-antiflood_points_tick_reduce Punkte abgezogen, kann aber 0 Punkte nicht unterschreiten. Besagte Einstellung kann nicht weniger als 1 sein.

Bei einer Aktion gilt folgender Pseudo-Code:

FALLS man kein b_client_ignore_antiflood hat DANN
ERHÖHE Client-Flood-Punkte UM genannte Flood-Punkte

FALLS genannte Flood-Punkte >= 0
  UND man kein b_client_ignore_antiflood hat
  UND virtualserver_antiflood_points_needed_command_block >= Client-Flood-Punkte DANN
WERFE Fehler
SONST
FÜHRE Befehl AUS

Flood-Punkte führen bereits bei Gleichheit mit virtualserver_antiflood_points_needed_command_block zu einem Fehler (übrigens einer der wenigen Orte, wo der Nutzer in der deutschen Version – übrigens noch gar nicht so lange – geduzt wird). Hat ein Client b_client_ignore_antiflood, kann er keine Punkte aufbauen, aber noch Punkte besitzen, die er vorm Erhalt des Rechts hatte und die noch nicht komplett abgebaut sind (seltene Situation).

Clients mit b_client_ignore_bans (nicht jedoch b_client_ignore_antiflood!) umgehen den IP-Block, ansonsten bekommt man flood prevention, please try again later angezeigt. Das ist kein Bann, also wird niemand gekickt (aber b_client_ignore_bans wirkt)! Das steht auch explizit im Changelog. Der Sinn darin, nicht zu bannen oder zu kicken, erschließt sich mir nicht so ganz.

Das Verbinden zu einem Server entspricht 80 Punkte (missachtet b_client_ignore_antiflood), die allerdings sofort wieder abgezogen werden, wenn die Verbindung hergestellt ist und die ersten anderen Befehle ausgetauscht werden.

virtualserver_antiflood_points_needed_ip_block <= 80 führt also dazu, dass Clients ohne b_client_ignore_bans nicht mehr auf den Server kommen können, auch wenn bei einem Login maximal 50 Flood-Punkte anfallen.

Liste der Aktionen

Abonnement-AktionenFlood-Punkte
channelsubscribe3Einen (anderen) Channel oder eine Familie abonnieren158
channelunsubscribe3Abonnement eines Channels oder einer Familie aufheben5
channelsubscribeall3Alle Channels abonnieren20
channelunsubscribeall3Alle Abonnements aufheben25
Ban-AktionenFlood-Punkte
banaddBeliebigen Ban erstellen25
banclientEinen derzeit verbundenen Client bannen und kicken25
bandelBan löschen5
bandelallAlle Bans löschen (man beachte die viel höheren Kosten von complaindelall)5
banlistBanliste25
Beschwerde-AktionenFlood-Punkte
complainaddSich beschweren25
complaindelBeschwerde löschen/zurücknehmen5
complaindelallAlle Beschwerden löschen (man beachte die viel geringeren Kosten von bandelall)25
complainlistBeschwerden anzeigen25
Rechte-AktionenFlood-Punkte
permissionlist1Rechteliste abfragen (falls nicht im Cache)5
permoverviewRechte-Übersicht5
servergroupaddpermServergruppen-Recht(e) hinzufügen5
servergroupdelpermServergruppen-Recht(e) löschen5
servergrouppermlistServergruppen-Rechte anzeigen5
clientaddpermClient-Recht(e) hinzufügen5
clientdelpermClient-Recht(e) löschen5
clientpermlistClient-Rechte anzeigen5
channeladdpermChannel-Recht(e) hinzufügen5
channeldelpermChannel-Recht(e) löschen5
channelpermlistChannel-Rechte anzeigen5
channelgroupaddpermChannelgruppen-Recht(e) hinzufügen5
channelgroupdelpermChannelgruppen-Recht(e) löschen5
channelgrouppermlistChannelgruppen-Rechte anzeigen5
channelclientaddpermClient-Channel-Recht(e) hinzufügen5
channelclientdelpermClient-Channel-Recht(e) löschen5
channelclientpermlistClient-Channel-Rechte anzeigen5
Channel-AktionenFlood-Punkte
channelcreateIrgendeine Art von Channel erstellen25
channeldeleteChannel löschen25
channelmoveElternchannel ändern25
channelgetdescription1Channel-Beschreibung abrufen0
channeleditPosition im Elternchannel ändern oder Channel bearbeiten25
Nachrichten-AktionenFlood-Punkte
clientchatclosed1Jemandem mitteilen, dass man das Chat-Fenster geschlossen hat5
clientchatcomposing1„tippt“-Benachrichtigung0
messageaddOffline-Nachricht verschicken25
messagedelOffline-Nachricht löschen5
messagegetText einer Offline-Nachricht anzeigen20
messagelistOffline-Nachrichten-Liste anzeigen25
messageupdateflag„gelesen”-Markierung einer Offline-Nachricht ändern5
textmessagesendNachricht senden (egal welcher Kanal)15
Channelgruppen-Aktionen (allgemein)Flood-Punkte
channelgroupaddChannelgruppe erstellen5
channelgroupclientlistZuordnungen von Channelgruppen, Clients und Channeln anzeigen5
channelgroupcopy1Channelgruppe kopieren5
channelgroupdelChannelgruppe löschen5
channelgrouplistChannelgruppenliste anzeigen5
channelgrouprename1Channelgruppe umbenennen5
setclientchannelgroupChannelgruppe setzen25
Servergruppen-Aktionen (allgemein)Flood-Punkte
servergroupaddServergruppe erstellen5
servergroupaddclientClient zu Servergruppe hinzufügen25
servergroupclientlistClients in Servergruppe anzeigen5
servergroupcopy1Servergruppe kopieren5
servergroupdelServergruppe löschen5
servergroupdelclientClient aus Servergruppe entfernen25
servergrouplistServergruppenliste anzeigen5
servergrouprename1Servergruppe umbenennen5
servergroupsbyclientidServergruppen eines Clients anzeigen5
Client-Datenbank-AktionenFlood-Punkte
clientdbdeleteClient aus Datenbank löschen25
clientdbeditClient-Beschreibung ändern25
clientdbfindClients in Datenbank suchen50
clientdblist10 Einträge aus Client-Datenbank laden25
Client-Aktionen (sichtbar)Flood-Punkte
clientmoveChannel betreten oder andere Clients bewegen10
clientupdateEigene Client-Eigenschaften ändern außer Mikrofon deaktivieren15
clientkickVom Server oder Channel kicken25
clientpokeAnstupsen25
clientedit1In einem moderierten Channel Talkpower vergeben/wegnehmen25
clientmuteJemanden stummschalten07
clientunmuteJemanden nicht mehr stummschalten07
clientupdateBearbeiten, wie man auf dem Server angezeigt wird06
Client-Aktionen (informativ)Flood-Punkte
clientgetdbidfromuid2Datenbank-ID einer globalen ID erhalten5
clientgetids2Anzeigen, mit welchen Clients eine globale ID derzeit verbunden ist5
clientgetnamefromdbidLetzten von einer DBID verwendeten Namen erhalten (redundanter Befehl in ServerQuery)5
clientgetnamefromuid2Letzten von einer globalen ID verwendeten Namen erhalten5
clientgetuidfromclid2Globale ID eines verbundenen Clients erhalten (redundanter Befehl)5
clientsetserverquerylogin1ServerQuery-Login erstellen25
connectioninfoautoupdate1Sende Verbindungsstatistiken des Clients an der Server0
Client-Aktionen (intern)Flood-Punkte
clientdisconnect1Verbindung trennen0
clientgetvariables1Informationen über einen Client erhalten0
clientinit12. Schritt beim Verbindungsaufbau0
clientinitiv11. Schritt beim Verbindungsaufbau0
setwhisperlist1Whisperliste aktualisieren0
Temporäres-Passwort-AktionenFlood-Punkte
servertemppasswordadd1Temporäres Passwort erstellen5
servertemppassworddel1Temporäres Passwort löschen5
servertemppasswordlist1Liste der temporären Passwörter anzeigen5
Berechtigungsschlüssel-AktionenFlood-Punkte
tokenaddBerechtigungsschlüssel erstellen5
tokendeleteBerechtigungsschlüssel löschen5
tokenlistBerechtigungsschlüssel-Liste anzeigen5
tokenuseBerechtigungsschlüssel benutzen5
Datei-AktionenFlood-Punkte
ftcreatedirOrdner erstellen5
ftdeletefileDatei löschen5
ftgetfileinfo2Datei-Informationen anzeigen (im Prinzip redundant zu FtGetFileList)5
ftgetfilelistDateiliste in einem Ordner anzeigen0
ftinituploadEine Datei hochladen0
ftinitdownloadEine Datei runterladen0
ftlist2Liste der Dateitransfers anzeigen5
ftrenamefileDatei umbenennen5
ftstopBefehl hat keine mir bekannte Funktion5
Sonstige AktionenFlood-Punkte
logview1Logbuch anzeigen50
serveredit1Server-Einstellungen bearbeiten5
serverquerycmd1Voice-Client-ServerQuery (bis Client 3.0.8.1), je Befehl5
verifychannelpasswordChannel-Passwort überprüfen05
verifyserverpasswordServer-Passwort überprüfen05
Inoffizielle Befehle und AktionenFlood-Punkte
getconnectioninfo1Parameter: clid0
servergetvariablesgibt notifyserverupdated0
setconnectioninfonichts geschieht0
clientsitereportnichts geschieht0
dummy_connectfailednichts geschieht0
dummy_connectionlost4Plug-In beantwortet diesem Client alle Befehle nur noch mit Fehler 17920
dummy_newipnichts geschieht0
plugincmdsiehe ServerQuery-Dokumentation5
Fußnoten:
1 = kein ClientQuery (nur intern vom Client verwendet)
2 = nur ClientQuery (vermutlich)
3 = ClientQuery undokumentiert
4 = nur ClientQuery (undokumentiert)
5 = verifychannelpassword und verifyserverpassword haben anders als alle anderen Befehle keine Flood-Punkte, wenn die Parameter fehlen, ansonsten haben siee 5 Punkte
6 = 0 ohne Parameter und den folgenden Befehlen (auch in Kombination ausschließlich untereinander), sonst 15 Punkte unabhängig von der Anzahl.
  • client_input_hardware1 mit Wert 0 (hat aktiven Tab gewechselt)
  • client_input_deactivated
  • client_default_token
  • alles ohne Änderung außer client_is_channel_commander und client_nickname
    „ohne Änderung“ bedeutet: Der Client führt keine Änderung durch, wenn sich der Wert nicht von dem unterscheidet, den man als letztes gesetzt hat oder versucht hat zu setzen
7 = 0, damit man eine Person nicht mehr hört und damit der Befehl laut ClientQuery-Rückgabe erfolgreich ausgeführt wird. 5, damit Daten vom Server zurückgehalten bzw. wieder gesendet werden und sich der Client im Chat (auch bei ClientQuery!) nicht über Flooding beschwert. Weitere 5, damit sich der Client im Chat (auch bei ClientQuery!) nicht (noch einmal) über Flooding beschwert.
8 = unterstützt Array-Parameter, Flood-Punkte unabhängig von der Länge des Arrays

Nicht ausgewertete Aktionen

ClientQuery-Befehle, die wohl keine Interaktion mit dem Server auslösen (synchrone, zumeist rein informative Befehle):

Diejenigen Befehle aus obiger Liste, die nicht wegen ServerQuery existieren, existieren auf Serverseite auch nicht.

ServerQuery-Befehle, die nicht von ClientQuery und vermutlich auch nicht vom Client genutzt werden (größtenteils Instanz-Befehle oder Befehle, die ich hier erneut liste, weil sie in den vorherigen Liste sind und daher andere als die hier genannten gleichnamigen ServerQuery-Befehle):

Sofern der Client sie doch verwenden würde, würde er meist 5 Flood-Punkte erhalten (abweichende Flood-Punkte sind in Klammern angegeben).

Verbindungsaufbau

Setzt man die Befehle bis zur Blockierung auf weniger als 11, bekommt man beim Verbinden die maximal möglichen drei bis vier Fehlermeldungen, da der Client nach dem Herstellen der Verbindung drei bis vier Aktionen versucht, für die er Flood-Punkte erhält. Folgende Aktionen werden ausgeführt:

  1. clientinitiv.
  2. clientinit.
  3. Vermutlich: Setzen des Standardchannels (10 Punkte). Wird aber auch ausgeführt, wenn man keinen Standardchannel gesetzt hat.
  4. Setzen der Abzeichen (15 Punkte). Wie jedes andere Ändern der eigenen Client-Eigenschaften kostet es 15 Punkte. Falls das nicht funktioniert, läuft im Client ein Timer unabhängig vom Server, der es alle 10 Sekunden erneut probiert, bis es klappt. Sofern virtualserver_antiflood_points_needed_command_block mindestens 16 ist, wird es irgendwann klappen, da man in 10 Sekunden wie oben erwähnt mindestens 20 Punkte regeneriert.
  5. permissionlist (5 Punkte), falls sich die Datei nicht im Cache befindet.
  6. clientgetvariables (0 Punkte)
  7. Abonnieren von Channeln. Hat man das Abonnieren aller Channels aktiviert, benötigt das selbstverständlich 20 Punkte, hat man es nicht aktiviert, wird ein einzelner Channel abonniert, was 15 Punkte kostet.

(veraltete Quelle einiger Teile dieses Ablaufs)