Opisany poniżej problem dotyczy użytkowników posiadających ograniczone uprawnienia do publikacji wpisów na stronie www. Dla domyślnie skonfigurowanej instancji WordPress są to autor
i współpracownik
.
Przykładowy opis wywołania błędu usuwania atrybutu
Aby wywołać przykładowy błąd, należy zalogować się do panelu administratora systemu WordPress, jako użytkownik posiadający uprawnienia autor
lub współpracownik
. Następnie należy do dowolnego wpisu wprowadzić tag, który posiada atrybut o ograniczonej dostępności (np. download
, rel
, data-label
, class
, id
). Podczas zapisu wpisu atrybut zostanie automatycznie i bezpowrotnie usunięty z treści. Użytkownik nie zostanie w żaden sposób poinformowany o dokonanej zmianie.
Ten sam problem można wywołać, edytując wpis, w którym atrybut został już dodany (na przykład przez użytkownika z uprawnieniami redaktor
lub administrator
). Po zapisie edytowanego wpisu atrybut zostanie automatycznie usunięty, bez żadnego powiadomienia.
Złożoność problemu automatycznego usuwania atrybutu
Teoretycznie problem nie jest bardzo złożony, jednakże może przyczynić się do stworzenia trudnych w zlokalizowaniu błędów. Aby lepiej zrozumieć zagadnienie, należy wyobrazić sobie użytkownika o uprawnieniach autor
, który wprowadził do WordPressa artykuł na przykład liczący 500 słów. W treści artykułu użytkownik dodał kilka linków, a w jednym z nich dodał PDF-a do pobrania (z atrybutem download
). Podczas zapisu wpisu użytkownik nie zostanie w żaden sposób poinformowany o tym, że wprowadzona przez niego treść została zmodyfikowana. Przy artykule liczącym 500 słów trudno będzie zauważyć zniknięcie jednego atrybutu.
Jeszcze bardziej problematycznym przykładem wywołania błędu może być sytuacja, w której współpracownik próbuje edytować wpis, który został opublikowany rok temu (np. poprawia literówkę lub błąd ortograficzny). Przez rok użytkownicy o wyższych uprawnieniach (redaktor
lub administrator
) mogli edytować wpis i na przykład dodać do niego specjalne klasy wyróżniające akapit (class
) lub identyfikatory do bezpośredniego linkowania (id
). Jeśli taki wpis edytuje użytkownik o uprawnieniach autor
lub współpracownik
, to wszystkie atrybuty o ograniczonej dostępności zostaną bezpowrotnie usunięte z treści wpisu, pomimo że bazowo został on dodany przez użytkownika posiadającego wyższe uprawnienia. I to wszystko wydarzy się bez żadnego komunikatu o błędzie.
Jak rozwiązać problem automatycznego kasowania atrybutów?
Aby rozwiązać problem automatycznego kasowania atrybutów, należy dodać odpowiednie uprawnień dla ról, które ich nie posiadają (unfiltered_html
) lub edytować listę dozwolonych tagów i atrybutów (wp_kses_allowed_html
). Pierwsza opcja jest uniwersalna, ale powoduje, że użytkownicy o niższych uprawnieniach nie mają żadnych ograniczeń dotyczących wprowadzanych do treści tagów i atrybutów html. Druga opcja jest bardziej restrykcyjna, ale w jej przypadku atrybuty i tagi trzeba ręcznie definiować, a więc istnieje duże ryzyko, że nie zdefiniujemy wszystkich niezbędnych tagów lub atrybutów.