"Bezpieczny" procesor markdown dla PHP?

Czy istnieje implementacja PHP markdown odpowiednia do użycia w publicznych komentarzach?

Zasadniczo powinien zezwalać tylko na podzbiór składni markdown (pogrubienie, kursywa, linki, cytaty blokowe, bloki kodowe i listy) i usuwać cały wbudowany HTML (lub ewentualnie go unikać?)

Domyślam się, że jedną z opcji jest użycie normalnego parsera markdown i uruchomienie wyjścia przez środek dezynfekujący HTML, ale czy jest na to lepszy sposób..?

Używamy PHP markdown Extra do reszty miejscu, więc musielibyśmy już użyć wtórnego parsera (wersja nie-"Extra", ponieważ takie rzeczy jak obsługa przypisów są niepotrzebne).. Wydaje się też, że ładniejsze jest parsowanie tylko *bold* tekstu i posiadanie wszystkiego uciekającego do &lt;a href="etc"&gt;, niż generowanie <b>bold</b> tekstu i próba usunięcia tych bitów, których nie chcemy..

Również, w związku z tym, używamy kontroli WMD dla" głównej " strony, ale w komentarzach, jakie są inne opcje? Podgląd javascript WMD jest ładny, ale musiałby to samo " wykastrować" jako procesor PHP markdown (nie może wyświetlać obrazów i tak dalej, w przeciwnym razie ktoś zgłosi się i ich roboczy markdown "pęknie")

Obecnie moim planem jest użycie metody PHP-markdown - > HTML santiser i edycja WMD w celu usunięcia składni obrazu/nagłówka z showdown.js - ale wygląda na to, że było to robione niezliczoną ilość razy wcześniej..

W zasadzie:

  • czy istnieje" bezpieczna " implementacja markdown w PHP?
  • czy istnieje edytor znaczników HTML/javascript, który mógłby czy te same opcje są łatwo wyłączone?

Update: skończyłem po prostu uruchamiając markdown() wyjście przezHTML Purifier .

W ten sposób renderowanie Markdown było oddzielone od sanityzacji wyjściowej, która jest znacznie prostsza (dwie najczęściej niezmodyfikowane bazy kodu) bezpieczniejsza (nie próbujesz robić zarówno renderowania, jak i sanityzacji jednocześnie) i bardziej elastyczna (możesz mieć wiele poziomów sanityzacji, powiedzmy bardziej luźną konfigurację zaufanych treści i wiele innych). bardziej rygorystyczna Wersja Dla komentarzy publicznych)

Author: dbr, 2009-05-20

4 answers

PHP Markdown ma opcję sanitizer, ale nie wydaje się być nigdzie reklamowany. Spójrz na górę klasy Markdown_Parser w markdown.php (zaczyna się na linii 191 w wersji 1.0.1 m). Interesują nas linie 209-211:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

Jeśli zmienisz je na true, znaczniki i encje powinny być odpowiednio znakowane, a nie wstawiane dosłownie. Wygląda na to, że nie ma wbudowanego sposobu, aby je zmienić( np. poprzez konstruktor), ale zawsze możesz go dodać:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

Zauważ, że powyższa funkcja tworzy nowy parser przy każdym uruchomieniu, a nie buforuje go tak, jak robi to dostarczona funkcja Markdown (linie 43-56), więc może być trochę wolniejsza.

 27
Author: Noah Medling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 17:08:51

JavaScript Markdown Editor Hipoteza:

  • Użyj edytora Markdown opartego na JavaScript, np. na podstawie showdown
  • Usuń wszystkie ikony i wskazówki wizualne z paska narzędzi dla niechcianych elementów
  • Skonfiguruj Filtr JavaScript, aby wyczyścić niechciane znaczniki przy przesyłaniu
  • testuj i utwardzaj wszystkie zmiany i filtry JavaScript lokalnie na swoim komputerze
  • Mirror tych filtrów w PHP submission script, aby złapać to samo po stronie serwera.
  • Usuń wszystkie odnośniki do niechcianych elementów z pomocy / tutoriali

Stworzyłem edytor Markdown w JavaScript, ale ma ulepszone funkcje. Zajęło to sporo czasu i zmiany SVN. Ale nie sądzę, że byłoby tak trudno zmienić edytor Markdown, aby ograniczyć dozwolony HTML.

 2
Author: Fran Corpier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 14:57:29

Jeśli chcesz napisać własny parser, dlaczego nie użyć architektury BBCode.

Przy zgłaszaniu komentarzy/(użytkownik) musisz dodać tekst za pomocą mysql_escape_real_string (), tak są inne funkcje, ale to zatrzyma wszelkie zastrzyki JS.

 -1
Author: James Brooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 10:43:40

A co z uruchomieniem htmlspecialchars na wprowadzonym przez użytkownika wejściu, przed przetworzeniem go przez markdown? Powinien uciec od wszystkiego, co niebezpieczne, ale zostawić wszystko, co markdown rozumie.

Próbuję wymyślić sprawę, w której to by nie zadziałało, ale nie mogę wymyślić niczego od ręki.

 -1
Author: Brad Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-14 10:07:34