Dezinfekce textového vstupu v PHP

Existuje řada dezinfekčních PHP funkcí, bohužel ani jedna komplexní, která by snadno a spolehlivě zlikvidovala pokusy o podsunutí různých skriptů nebo nevhodných tagů. Kromě toho samozřejmě potřebujete vymazat prázdné znaky a tabulátory na začátku i na konci řetězce. A někdy se také hodí ponechat některé tagy povolené, což poněkud komplikuje regulární výrazy, které likvidují všechno.

function Clear_Tags($text, $allowed_tags)
{
$search = array(‚/<script[^>]*?>.*?<\/script>/si‘// smaže javascript
‚/<style[^>]*?>.*?<\/style>/siU‘,    // smaže stylovací tagy
‚/<![\s\S]*?–[ \t\n\r]*>/‘,         // smaže různé typy komentářů
‚/\[.*?\].*?\[\/.*?\]/si‘ // smaže BB code
);
$text = preg_replace($search, “, $text); //aplikuje výše uvedené regulární výrazy
$text = strip_tags($text, $allowed_tags); // smaže HTML tagy kromě povolených
$text = trim($text); // smaže prázdné znaky a tabulátory na začátku a konci řetězce
return $text;
}

Nepovinná proměnná $allowed_tags může specifikovat povolené tagy. Funkce bez problémů zlikviduje různé typy vložených komentářů (do kterých lze vsunout zákeřný skript), vymaže javascript, PHP tagy, BB code tagy a všechny HTML tagy kromě výslovně povolených. Funkce je vhodná například k dezinfekci textu pro diskuzní fóra, ale není vhodná pro úpravu URL či některých dalších parametrů! Pokud budete měnit regulární výrazy, tak musíte použít syntaxi pro Perl, ne POSIX! Případné další nápady a připomínky pište do komentů, víc hlav víc ví 🙂

6 komentářů u „Dezinfekce textového vstupu v PHP“

  1. Pozor na funkci strip_tags. Pokud povolíte nějaké HTML značky, tak uvedenou funkcí projde škodlivý JS kód umístěný v HTML onNěco atributech.

    Odpovědět
    • Díky za tip! Ovšem výše uvedená funkce JS stejně smaže, protože to nejdřív projde regulárním výrazem a ten JS najde i mezi tagy.

    • Nerozumíme si. JS kód může být kromě značky i v HTML atributech.

      Zkuste si kód: text

      Pokud značku (nebo kteroukoliv jinou) ve strip_tags povolíte, bude web zranitelný.

      Stejně tak projde například atribut style. Tudíž pokud máte toto řešení někde na svém webu s nějakou povolenou HTML značkou, není problém tam přidat například obsah přes celou stránku (pomocí CSS), který bude klikat na útočníkův web (pomocí JS).

  2. Ano, došlo mi to až později. Zkusím něco vymyslet aby to nešlo takto obejít, díky za tip. V zásadě by šlo buď zakázat HTML atributy úplně nebo smazat onclick=, případně pro jistotu obojí.

    Odpovědět

Napsat komentář