Ošetřujeme příspěvky návštěvníků stránek

9. listopadu 2002

Necháme-li návštěvníky přispívat na své stránky přímo, kromě nabourání nezabezpečené aplikace nám mohou znepříjemnit život i ti, kdo si libují v neslušených a vulgárních výrazech. Pokud pak třeba ukazujeme náhled nejnovějších příspěvků na hlavní stránce, nepříjemné pikantnosti zde mohou být zobrazeny až do doby, kdy si toho náhodou povšimneme, nebo nás na to někdo s patřičnou ostudou upozorní.

Pokud nechceme použít mechanismus moderování, kdy každý příspěvek před zveřejněním musí schválit moderátor, je řešením použít následující funkci, která pomocí regulárních výrazů a seznamu zakázaných tvarů slov nevhodné výrazy v textu nahradí nebo je vyřadí úplně. V ukázce budou pikantní věty zadané do textového pole po odeslání opsány v části nad textovým polem, přičemž nevhodné výrazy budou nahrazeny textem [cenzurováno].

Nejprve si do souboru badwords.php připravíme seznam nevhodných výrazů, podobně jako zde:

<?php
$profan[]=’hloupý‘;
$profan[]=’hloupy‘;
$profan[]=’špatný‘;
$profan[]=’špatny‘;
$profan[]=’spatný‘;
$profan[]=’spatny‘;
?>

Všimněte si, že jedno slovo je zadáno ve všech možných tvarech s diakritikou i bez ní. Důvodem je přesné porovnávání regulárními výrazy. Mohli bychom sice cenzurovat jakýkoli výskyt zadaného řetězce, ovšem pak by se nám cenzurovaly i části slov, které mohou obsahovat „závadnou“ část, ale jinak jsou naprosto korektní (příkladem může být třeba označení místa pro ukládání knih). Z nejhoršího nám tento způsob odpomůže, avšak pokud někdo část takového slova nahradí tečkami, hvězdičkami nebo doplní podtržítka, naše funkce takový výraz neodchytí, nelze ji tedy považovat za všelék. Ještě horší je případ, kdy někdo zadá diakritické znaky pomocí entit (např. &agrave;) nebo pomocí kódů UNICODE (např. &#0161;), v tom případě slovo projde naprosto necenzurované. Pokud by tedy někdo působil problémy tímto způsobem, bude nutné doplnit do seznamu cenzurovaných slov i tvary zadané pomocí entit.

Do souboru censor.php si připravíme funkci, která bude zajišťovat cenzuru. Jednoduchým include souboru censor.php ji pak můžeme použít kdekoli potřebujeme:

<?php
function censor($censored)
{
  include ‚badwords.php‘; // zavést soubor s polem cenzurovaných slov
  $cmask = ‚<i>[cenzurováno]</i>‘; // nastavit nahrazovaný text
  if (is_array($profan)) // je zadáno nějaké slovo k cenzuře?
  {
    reset($profan); // nastavit na začátek pole cenzurovaných slov
    while (list(, $sWord) = each($profan)) // procházet cenzurovaná slova
    {
      if (strstr(strtoupper($censored), strtoupper($sWord)))
      { // existuje cenzurovaný výraz i pro danou položku pole cenzurované slovo
        if (strtoupper($censored)==strtoupper($sWord))
          $censored=$cmask;  // pokud je zadáno pouze jedno slovo a odpovídá cenzurovanému, nahradit textem
        else
        {
          $censored = eregi_replace(„^$sWord([^a-zA-Z])“, „$cmask\\1“, $censored); // nahrazovat všechny výskyty
          $censored = eregi_replace(„([^a-zA-Z])$sWord$“, „\\1$cmask“, $censored); // nahrazovat všechny výskyty
          while(eregi(„([^a-zA-Z])($sWord)([^a-zA-Z])“, $censored))
          {
            $censored = eregi_replace(„([^a-zA-Z])($sWord)([^a-zA-Z])“, „\\1$cmask\\3“, $censored);
          }
        }
      }
    }
  }
  return($censored);
}
?>

Ve funkci je vidět intenzívní využití regulárních výrazů, používá se funkce eregi_replace, která nahrazuje text nezávisle na velikosti znaků. Zde může nastat problém s nastavením kódování serveru, pokud se kódování textu neshoduje s kódováním serveru, pak převedení diakritických znaků na velká písmena bude nesprávné a funkce nebude cenzurovat správně. Ošetřen je zápis inkriminovaného slova s interpunkčními znaménky, okolo slova mohou být jakékoli jiné znaky mimo nediakritickýh písmen a slovo bude korektně cenzurováno. Detaily o použití regulárních výrazů můžete nalézt v článku Regulární výrazy v příkladech.

Kód použitých skriptů si můžete stáhnout. Jen upozorňuji, že soubor cenzurovaných slov je z pochopitelných důvodů pouze ukázkový.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *