Wyrażenie regularne a wulgaryzmy

Odpowiedz Nowy wątek
2016-07-27 14:39

Rejestracja: 6 lat temu

Ostatnio: 1 miesiąc temu

0

Witam,

Ma ktoś pomysł jak ugryźć wycinanie wulgaryzmów np. w formularzach na stronach ? Chodzi o coś lepszego niż str_replace, które można łatwo oszukać.

Np: zakazanym słowem niech będzie PROGRAMISTA .

P$ogramista
Programist(a)
pr ogramista
_programista

Jest wiele możliwości obejścia filtru - w konkretnym wypadku oczywiście niecenzuralne słowa, ale nie będę ich tu używał. Czy da się to jakoś skutecznie wycinać mimo stosowania przez użytkownika przykładowych chwytów jak zastępowanie literek innymi znakami albo dzielenie słowa spacjami ... ?


Dziura w ścianie gdzie Panowie widzą Panie,
Rick and Morty, season 1.
Szukam tej dziury, jak coś dajcie znać gdzie jest :D

"A z Ciebie c**** pisowski" - Ula Papuszko (w sensie, że JA) 05.06.2020 r., grupa: Strajk Przedsiębiorców. Witam zatem, jestem c**** pisowski ;)
Pokaż pozostałe 3 komentarze
No nie mniej automat odnoszący się do tego co przedstawiłem jest możliwy ? - youmound 2016-07-27 14:51
moim skromnym zdaniem jedyna możliwość jest taka aby zdefiniować słownik wyrazów dozwolony + odmiany przez przypadki i ignorować wszystko czego w słowniku nie ma ale to z punktu widzenia użyteczności będzie bardzo kiepskie, z punktu widzenia optymalizacji chyba jeszcze słabsze więc odpowiadając na twoje pytanie TAK można zrobić automat ale NIE raczej nigdy nie będzie on idealny - woolfik 2016-07-27 14:58
no to przykład prostego automatu wycinającego najbardziej powszechne obejścia ? - youmound 2016-07-27 15:01
chcesz gotowca ? - woolfik 2016-07-27 15:14
przykład na którym mógłbym się oprzeć zostawiając go na forum dajesz możliwość skorzystania innym - youmound 2016-07-27 15:37

Pozostało 580 znaków

2016-07-27 15:20

Rejestracja: 9 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Grudziądz/Bydgoszcz

0

To co pokazałeś jest jak najbardziej możliwe. Widziałem większe cuda robione regexem przez mojego kolegę, którego mogę nazwać geniuszem regexów. Ja niestety nic więcej nie powiem oprócz tego że są osoby co coś takiego są w stanie wykryć w 99%.


It's All About the Game.
ale przechwałki :P - Wibowit 2016-07-31 17:57
@Wibowit taka prawda, system do wykrywania słów z najróżniejszymi próbami obejścia tego już kiedyś napisał w pythonie, osobiście go nie obszedłem, zawsze złapał. - mr_jaro 2016-07-31 18:08

Pozostało 580 znaków

2016-07-27 16:18

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

0

Proponuję wyjść od ogółu do szczegółu.

Cel: Chcesz, aby wulgaryzmy w tekście były ocenzurowane.
Innymi słowy - potrzebujesz mechanizm, który na wejściu dostanie tekst do ocenzurowania i kryteria cenzurowania, a na wyjściu zwróci ocenzurowany tekst.

Kryteria cenzurowania:

Napisałeś że chcesz, aby mechanizm prócz cenzurowania dosłownego, radził sobie ze wstawkami różnych znaków, zamianami liter na inne znaki podobne graficznie w cenzurowanych słowach.
Przeanalizujmy te kryterium:

Patrząc na Twój przykład zauważyłem 3 sposoby obejścia zabezpiecznia:

  1. zamiana znaków na odpowiedniki graficzne np "s" na "$", "i" na "!" itd
  2. dopisanie różnego rodzaju przedrostków i przyrostków, np " ", "_", "(", ")"
  3. zamiana wielkości liter

W takim razie Twoje kryteria cenzurowania mogą się składać z następujących elementów:

  • lista wulgaryzmów
  • lista znaków, które mogą być przedrostkami i/lub przyrostkami
    Dodatkowo, mechanizm porównujący powinien ignorować wielkość liter

Myślę, że dla takiej definicji zadania będziesz w stanie napisać działające rozwiązanie.
W razie problemów pisz.

Pozostało 580 znaków

Rejek
2016-07-27 16:42
Rejek
0

Ja kiedyś spotkałem się z takim mechanizmem, że gdy ktoś napisał wulgaryzm to od razu dostawał bana i nawet jak ktoś się skapnął, że jest taki filtr to już go obejść nie mógł na tym koncie.

No i zawsze była nie pewność czy aby na pewno dane słowo przejdzie przez filtr i przez to mniej osób ryzykowało.

Pozostało 580 znaków

2016-07-30 22:26

Rejestracja: 13 lat temu

Ostatnio: 6 godzin temu

0

Można spróbować podejść do tego trochę inaczej - sieci neuronowe. Można te. Sieci nauczyć rozpoznawania z jakimś prawdopodobieństwem wulgaryzmy. Będzie to bardziej uniwersalny sposób, bo jak będziesz chciał dopisać nowe słowo, to uczysz/sposob obejścia te sieć i juz następnym razem powinno to i podobne tricki zablokować

Problemem wg mnie jest kilka: szansę na false positive oraz większe wymagania od sprzętu (głównie ramu).


Pozostało 580 znaków

2016-07-30 22:34

Rejestracja: 6 lat temu

Ostatnio: 57 sekund temu

1

Nie ma sensu. To forum niby ma cenzurę: piszę
prostytutka (k u r w a) i cenzuruje.
piszę
c**** (ch u j) i cenzuruje
piszę
g**no (g ó w n o)

Ale już:
kur**wa
czy
ch**uj
nie ocenzuruje.
Widocznie twórcy skryptu do cenzury nie pomyśleli o przypadkach brzegowych...

Poza tym po poco cenzurować przekleństwa? Lepiej już cenzurować słowa typu Viagra, cialis, clonazepam, enlarge your penis czy inne sformułowania, które się pojawiają w spamie/tekstach pisanych przez boty, niż nie pozwalać normalnym użytkownikom przeklinać.

Poza tym jeśli ocenzurujesz słowo "c****" i zrobisz to źle, to słowa podsłuchuj też bedą ocenzurowane... (tutaj na szczęście zrobili to dobrze, ale już spotkałem się z sytuacjami, gdzie słowa podsłuchuj były ocenzurowane).

innymi słowy z automatami do cenzury jest tak, że albo masz dużo fałszywych pozytywów i są cenzurowane normalne słowa, albo masz automaty, które łatwo oszukać (albo i to, i to), więc jak ktoś już wspomniał - jest to walka z wiatrakami. Już lepiej ręcznie moderować wulgarnie wypowiedzi, jeśli się odczuwa taką potrzebę.


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);
edytowany 5x, ostatnio: LukeJL, 2016-07-30 22:38

Pozostało 580 znaków

2016-07-31 10:01
Moderator

Rejestracja: 13 lat temu

Ostatnio: 4 dni temu

Lokalizacja: Rzeszów

1

Krótko: nie da się czegoś takiego zrobić. Nawet najlepsze mechanizmy można bardzo łatwo obejść, sposobów jest co najmniej kilka.

Opcje są dwie, proste:

  • napisz w regulaminie, że nie wolno, zrób sobie powiadomienie na wulgaryzmy (dzięki nieużywaniu auto-cenzora ludzie nie będą kombinować i będą pisać bezpośrednio, co łatwo dzięki temu wykryjesz do powiadomień - pod warunkiem, że nie powiesz ludziom, że masz takie powiadomienia) i ładuj bany
  • niczego nie cenzuruj, chyba, że prowadzisz forum dla dzieci, dorośli ludzie nie używają wulgaryzmów bez potrzeby, a wulgaryzmy nie są złem nieczystym i używanie ich w rozsądnych granicach jest ok

Swoją drogą - czy wiesz, że zajebisty nie jest już wulgaryzmem, ale już zajebać dalej tak?


Pozostało 580 znaków

2016-07-31 14:49

Rejestracja: 10 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Krasnystaw

0

Nie wiem na ile to jest skuteczne:

vulgar.php (lista słów wulgarnych):

return array(
    'foo',
    'bar',
    'programista',
    'programistka',    
    // i dalej wszystkie znane wulgaryzmy, z ich odmianami 
);
function filter_vulgar($text, $replacement = '******')
{
    $words = include 'vulgar.php';
    $result = $text;
    foreach ($words as $word)
    {
        $pattern = '/' . $word . '/i';
        if (preg_match($pattern, $result, $matches))
        {
            $result = preg_replace($pattern, $replacement, $result);
        }
    }
    return $result;
}
edytowany 1x, ostatnio: drorat1, 2016-07-31 14:51
a granica słowa? Bez tego podsłuchuj będzie brzydkim słowem, jeśli się umieści słowo c**** w cenzurowanych. - LukeJL 2016-07-31 18:12
No nie wiem czy to tak łatwo da się załatwić przez regex, sądzę że potrzebny jest jeszcze jeden plik z tablicą słówek, które w tych przypadkach należałoby uznać za dozwolone. Np. non_vulgar.php i tam to podsłuchuj i to by było sprawdzane ale musiałbym sprawdzić. - drorat1 2016-07-31 18:20
To jest BARDZO ZŁA droga, rozbudowując to spowodujesz to, że będzie jeszcze gorzej, bo zwiększysz poziom komplikacji kodu nie rozwiązując problemu. Przede wszystkim wyrażenia regularne są do wyrażeń regularnych. Żaden język, którym się posługują ludzie nie jest regularny, stąd wyrażenia regularne to zupełnie chybiony pomysł. I dosyć ciężki. Dwa, że nie robisz tu nic poza str_ireplace opakowanym w wyrażenia regularne. - dzek69 2016-07-31 18:27
to jest dobra droga jeśli chce się wyłudzić pieniądze z dotacji unijnych/publicznego budżetu. 1. lobbujesz za ustawą o wychowaniu w braku wulgarności 2. dajesz łapówkę komu trzeba żeby wygrać przetarg na narzędzie cenzorskie dla szkół 3. bierzesz milion złotych, z tego miliona masz zwrot łapówki 4. klepiesz na kolanie przez kilka godzin jakieś słabe rozwiązanie i wysyłasz Ministerstwu Cenzury jako gotową solucję 5. profit :) - LukeJL 2016-07-31 21:08
myślę, że wiele polskich projektów informatycznych tak powstało :) - LukeJL 2016-07-31 21:08

Pozostało 580 znaków

2016-07-31 20:21

Rejestracja: 6 lat temu

Ostatnio: 2 lata temu

0

Pozbywanie się wulgaryzmów

Pozostało 580 znaków

Wybitny Samiec
2016-08-01 17:50
Wybitny Samiec
1

Pomyślałem nad tym klika dni i wymyśliłem pewien algorytm.

Założenia (przykład dla cenzurowanego słowa "pupa"):

  1. cenzura ma działać, gdy litery są powielone: puuuuppa
  2. cenzura ma działać gdy zamiast liter są ich substytuty np [email protected]
  3. cenzura ma działać, gdy pomiędzy literami są jakieś separatory np p.u.p.a
  4. cenzura ma działać bez względu na wielkość liter np PuPa

Algorytm jest następujący:
Rozbijamy nasze cenzurowane słowo na tablicę liter: 'pupa' => ['p', 'u', 'p', 'a']
Dla każdej z liter tworzymy osobne wyrażenie regularne.
Tworzymy dodatkowe wyrażenie regularne definiujące separatory pomiędzy literami
Sklejamy ze sobą wszystkie wyrażenia regularne: naprzemiennie - wyr. regularne litery (w.r.) i wyr. regularne separatora (S)
i oznaczamy aby ignorował wielkość liter: 'pupa' => / (w.r. 'p') (S) (w.r. 'u') (S) (w.r. 'p') (S) (w.r. 'a') /i

Przykład dla litery - 'a':

  1. obsługa powieleń:
    "a" przekształcamy na "[a]+"

  2. obsługa substytutów:
    Załóżmy, że nasza definicja substytutów wygląda następująco:
    array(
    'a' => array('Q'),
    ...
    'u' => array('v')
    ...
    );

    Wówczas nasze przekształcenie będzie wyglądać tak:
    "[a]+" przekształcamy na "[a|Q]+"

  3. Obsługa separatorów:
    Załóżmy, że separatorami mogą być znaki '', '.' Wyrażenie regularne mogło by wyglądać tak: $separatorRegexp = [.]*
    Tablicę liter, którą zamieniliśmy w pkt 1 i 2 na tablicę wyrażeń regularnych należy złączyć w jeden string,
    a jako "kleju" użyć wyrażenia regularnego separatora z pkt 3 czyli:
    $regexp = implode(separatorRegexp, $arrayOfLetterPatterns)

  4. wielkość liter: $regexp = '/' . $regexp . '/i'

Oczywiście używamy preg_quote by nie rozwalić wyrażenia.

Napisałem przykładowy kod realizujący te zadanie:
https://github.com/Thommee/word-censor

Pozdr

Pozostało 580 znaków

2016-08-01 19:42
Moderator

Rejestracja: 13 lat temu

Ostatnio: 4 dni temu

Lokalizacja: Rzeszów

0

Możesz wrzucić jakieś demko online? Input do którego wpisuję treść i dostaję info czy w treści jest wulgaryzm czy nie


Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0