"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 <a href="etc">
, 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)
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.
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.
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.
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.
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