PHP Benutzer-Eingabe durch Blacklist aus Datenbank prüfen

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
619
ich lasse den user eine Eingabe machen und habe eine SQL Datenbank mit einzelnen Datensätzen, welche Blacklist-Wörter beinhaltet. Wie kann ich jetzt mit PHP prüfen, ob seine Eingabe ein Wort aus der Blacklist enthält ? mir fällt dazu gerade nichts ein.
 
Du hast zwei Listen mit strings. Du kannst zwei foreach Schleifen verschachteln. Falls eine Übereinstimmung kommt wird der User informiert.
Ich kenne mich mit PHP nicht so aus, könnte sein, dass es da auch extra Konstrukte gibt.

Je nach länge der Blacklist den Abgleich SQL machen "SELECT .... WHERE badWord==word". Wahrscheinlich nicht so elegant sich erst tausende Wörter aus der Datenbank zu holen.
 
  • Gefällt mir
Reaktionen: Pfandfinder
Hi...

Soll das für so eine Art BlackWord-Prüfung in einem Gästebuch/Forum/etc. werden?

Datensätze in ein Array einlesen und darauf eine Vergleichsabfrage mit dem Inhalt der Eingabe machen lassen > Stichwort: in_array
 
Ich würde das so machen...


PHP:
$blacklist_words = array(
    'hallo',
    'welt',
    'auto'
);

$benutzereingabe = "Ich habe ein Auto";
$benutzereingabe_hat_blacklist = false;

foreach( $blacklist_words as $word ) {
    if( strpos( $benutzereingabe, $word ) !== false ) {
        $benutzereingabe_hat_blacklist = true;
        return;
    }
}

if( $benutzereingabe_hat_blacklist ) {
    echo 'Benutzer hat ein böses Wort eingegeben';
} else {
    // Mach was auch immer du mit der Eingabe machen willst ;)
}

Klar musst du die Schleife an deine DB-Liste anpassen, aber prinzipiell funktioniert es so.
 
  • Gefällt mir
Reaktionen: netzgestaltung
Du kannst es auch so machen

<?php $blacklist = ['fu', 'bar']; $input = 'benutzer Eingabe fu bar'; $count = preg_match_all('/(' . implode('|', $blacklist) . ')/i', $input, $matches); If ($count > 0) { echo 'Böse Wörter: ' . implode(', ', $matches[0]); }

Sorry, weiß nicht wie man im Smartphone formatiert.

https://3v4l.org/P3XEJ#output
 
Zuletzt bearbeitet:
Warum nicht einfach die Datenbank fragen?

Also was wäre der Vorteil das gesamte Array zu laden?

Keine Ahnung was für eine DB du genau benutzt, aber sowas
Code:
SELECT * FROM blacklist WHERE word LIKE '%ass%'

würde dir alle Blacklist-Wörter liefern, die 'ass' enthalten.

Wenn du immer die komplette Eingabe auf die Blacklist-Wörter überprüfen willst, ist eine Datenbank vielleicht eine schlechte Wahl, dann solltest du deine Blacklist in-memory lassen.

Wenn du eine lange Blacklist hast, solltest du eine Hashmap / set nutzen und einmal über den Text laufen, dann hast du eine Laufzeit von "Anzahl der Wörter". Wenn du Kim's Vorschlag nutzt, hast du eine Laufzeit von "Anzahl der Wörter * Anzahl der Blacklistwörter" (was aber bei kleinen Texten, Blacklisten kaum Unterschied macht).

Lg
 
  • Gefällt mir
Reaktionen: RalphS
So ganz problemlos ist der Ansatz nicht- Varianten müssen auch gefangen werden und false positive gilt es zu vermeiden— aber besser DB fragen als Array.

Je nachdem was verfügbar ist bzw gemacht werden kann ist hier eine Volltextsuche sinnvoll, komplett mit stemming. Oder natürlich eine vorbereitete Liste mit selbem, dann spart man ggfs die FTS.

“Porn” fangen - gut. P0rn nicht fangen - schlecht. “Anspornen” sperren - doof.
 
Das erinnert mich daran, wie ich vor ewigen Jahren mal von einem Bot in einem Chat für das Wort „Haarschnitt“ gesperrt wurde. ;)
 
Fuer sowas nimmt man eher Lucene (Analyzer, Tokenizer, etc.) oder andere NLP Tools, so das auch Stemming, phonetische Matches etc. berucksichtigt werden koennen

Am Ende aber Aufwand/Nutzen.

Warum die Blacklist in einer DB steht, hab ich nicht so ganz verstanden?
 
Wir hier keine OT Debatte starten, aber statt Blacklist lässt sich auch einfach der Ausdruck "Blocklist" (und "Allowlist" statt "Whitelist") verwenden.

Zum Thema, hätte mit der Gefahr viele false-positiv Treffer zu verursachen, auch erstmal den simplen Ansatz von @FranzvonAssisi verfolgt.
 
Zurück
Oben