Czy istnieje prosty sposób, aby pobrać ciąg HTML w JavaScript i usunąć HTML?
javascript
html
string
Bryan
źródło
źródło
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
źródło
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
jeśli wstrzykujesz przezdocument.write
lub łączysz z łańcuchem zawierającym>
przed wstrzyknięciem przezinnerHTML
.>
zostaną w drugim. Nie jest to jednak ryzyko wstrzyknięcia. Zagrożenie występuje z powodu<
pozostawienia w pierwszym, co powoduje, że parser HTML jest w kontekście innym niż stan danych, gdy rozpoczyna się drugi. Uwaga: nie ma przejścia ze stanu danych na>
.<button onClick="dostuff('>');"></button>
zakładając, że poprawnie napisany HTML, nadal musisz wziąć pod uwagę, że gdzieś w cytowanym tekście atrybutu może znajdować się znak większy niż Ponadto chciałbyś<script>
przynajmniej usunąć cały tekst z tagów.Najprostszy sposób:
To pobiera cały tekst z ciągu HTML.
źródło
Chciałbym udostępnić zredagowaną wersję zatwierdzonej odpowiedzi Shog9 .
Jak zauważył Mike Samuel w komentarzu, ta funkcja może wykonywać wbudowane kody javascript.
Ale Shog9 ma rację mówiąc „pozwól przeglądarce zrobić to za Ciebie ...”
więc .. tutaj moja edytowana wersja przy użyciu DOMParser :
tutaj kod do testowania wbudowanego javascript:
Ponadto nie żąda zasobów podczas analizowania (jak obrazy)
źródło
Jako rozszerzenie metody jQuery, jeśli Twój ciąg może nie zawierać HTML (np. Jeśli próbujesz usunąć HTML z pola formularza)
zwróci pusty ciąg, jeśli nie ma HTML
Posługiwać się:
zamiast.
Aktualizacja: Jak wskazano w komentarzach, w niektórych okolicznościach to rozwiązanie wykona javascript zawarty w nim,
html
jeślihtml
atakujący może wpłynąć na wartość, użyj innego rozwiązania.źródło
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Konwertowanie HTML na e-maile w formacie zwykłego tekstu z zachowaniem nienaruszonych hiperłączy (href)
Powyższa funkcja opublikowana przez hipoksyd działa dobrze, ale szukałem czegoś, co w zasadzie przekształciłoby HTML utworzony w edytorze Web RichText (na przykład FCKEditor) i wyczyściło cały HTML, ale zostawiłem wszystkie linki, ponieważ chciałem zarówno HTML, jak i wersja zwykłego tekstu ułatwiająca tworzenie poprawnych części wiadomości e-mail STMP (zarówno HTML, jak i zwykły tekst).
Po długim czasie przeszukiwania Google sam i moi koledzy wymyślili to za pomocą silnika regex w JavaScript:
str
zmienna zaczyna się tak:a następnie po uruchomieniu kodu wygląda to tak:
Jak widać, cały HTML został usunięty, a łącze zostało wytrwałe, a hiperłączony tekst jest nadal nienaruszony. Mam również otrzymuje
<p>
i<br>
tagi z\n
(char nowego wiersza), tak, że jakiś rodzaj formatowania wizualnego został zatrzymany.Aby zmienić format linku (np.
BBC (Link->http://www.bbc.co.uk)
), Po prostu edytuj$2 (Link->$1)
, gdzie$1
jest adres URL / URI href, a$2
tekst jest hiperlinkiem. Dzięki linkom bezpośrednio w treści zwykłego tekstu większość klientów poczty SMTP konwertuje je, aby użytkownik mógł je kliknąć.Mam nadzieję, że to było przydatne.
źródło
Poprawa przyjętej odpowiedzi.
W ten sposób coś takiego działa nie zaszkodzi:
Firefox, Chromium i Explorer 9+ są bezpieczne. Opera Presto jest nadal podatna na ataki. Również obrazy wymienione w ciągach nie są pobierane w Chromium i Firefox zapisując żądania HTTP.
źródło
<script><script>alert();
Powinno to działać w dowolnym środowisku Javascript (w tym NodeJS).
źródło
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
I zmienił odpowiedź Jibberboy2000 w celu uwzględnienia kilku
<BR />
formatów tagów, usuń wszystko wewnątrz<SCRIPT>
i<STYLE>
tagów formatowania wynikowy HTML poprzez usunięcie wielu podziały wiersza i spacje i przekonwertować pewną HTML zakodowany kod do normy. Po kilku testach okazuje się, że można przekonwertować większość pełnych stron internetowych na prosty tekst, w którym zachowany jest tytuł strony i treść.W prostym przykładzie
staje się
Funkcja JavaScript i strona testowa wyglądają tak:
Został użyty z tym HTML:
źródło
/<p.*>/gi
powinno być/<p.*?>/gi
.<br>
tagów można użyć wyrażenia regularnego dobrą zamiast:/<br\s*\/?>/
w ten sposób można mieć tylko jedno zastąpić zamiast 3. Ponadto wydaje mi się, że oprócz dekodowania jednostek można mieć jednego regex, coś takiego:/<[a-z].*?\/?>/
.To jest wersja wyrażenia regularnego, która jest bardziej odporna na zniekształcone HTML, takie jak:
Niezamknięte tagi
Some text <img
„<”, „>” wewnątrz atrybutów tagu
Some text <img alt="x > y">
Newlines
Some <a href="http://google.com">
Kod
źródło
Innym, co prawda mniej eleganckim rozwiązaniem niż nickf czy Shog9, byłoby rekursywne przejście DOM zaczynając od znacznika <body> i dołączenie każdego węzła tekstowego.
źródło
Jeśli chcesz zachować linki i strukturę treści (h1, h2 itp.), Powinieneś sprawdzić TextVersionJS Możesz go używać z dowolnym HTML- em , chociaż został stworzony do konwersji wiadomości e-mail HTML na zwykły tekst.
Użycie jest bardzo proste. Na przykład w node.js:
Lub w przeglądarce z czystym js:
Działa również z wymaga.js:
źródło
Po wypróbowaniu wszystkich wymienionych odpowiedzi większość, jeśli nie wszystkie, miały przypadkowe przypadki i nie były w stanie w pełni zaspokoić moich potrzeb.
Zacząłem badać, w jaki sposób robi to php, i natknąłem się na bibliotekę php.js, która replikuje metodę strip_tags tutaj: http://phpjs.org/functions/strip_tags/
źródło
allowed == ''
myślę, że o to poprosił PO, co prawie odpowiada Byron poniżej (Byron tylko[^>]
pomylił się).allowed
param, jesteś podatny na XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
return<p onclick="alert(1)">mytext</p>
Konta dla> wewnętrznych atrybutów i
<img onerror="javascript">
nowo tworzonych elementów dom.stosowanie:
próbny:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
demo najlepszych odpowiedzi na te okropne rzeczy:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
źródło
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
.).Wiele osób już na to odpowiedziało, ale pomyślałem, że użyteczne może być udostępnienie napisanej przeze mnie funkcji, która usuwa tagi HTML z łańcucha, ale umożliwia dołączenie tablicy tagów, których nie chcesz usuwać. Jest dość krótki i działa dobrze dla mnie.
źródło
Myślę, że najłatwiej jest po prostu użyć wyrażeń regularnych, jak ktoś wspomniany powyżej. Chociaż nie ma powodu, aby używać ich wielu. Próbować:
źródło
[^<>]
z[^>]
ponieważ prawidłowy tag nie może zawierać<
znak, a następnie luka XSS znika.Wprowadziłem pewne modyfikacje do oryginalnego skryptu Jibberboy2000 Mam nadzieję, że przyda się komuś
źródło
Oto wersja, która w pewnym sensie rozwiązuje problem bezpieczeństwa @ MikeSamuel:
Uwaga: zwróci pusty ciąg, jeśli znacznik HTML nie jest prawidłowym kodem XML (inaczej: tagi muszą być zamknięte, a atrybuty muszą być cytowane). Nie jest to idealne, ale pozwala uniknąć problemu wykorzystania potencjału bezpieczeństwa.
Jeśli nie masz poprawnego znacznika XML, możesz spróbować użyć:
ale nie jest to idealne rozwiązanie z innych powodów.
źródło
Możesz bezpiecznie usunąć tagi HTML za pomocą atrybutu piaskownicy iframe .
Chodzi o to, że zamiast regexować nasz ciąg znaków, korzystamy z natywnego parsera przeglądarki, wstrzykując tekst do elementu DOM, a następnie sprawdzając właściwość
textContent
/innerText
tego elementu.Najlepszym elementem do wstrzykiwania naszego tekstu jest ramka iframe w piaskownicy, w ten sposób możemy zapobiec wykonaniu dowolnego kodu (znanego również jako XSS ).
Minusem tego podejścia jest to, że działa tylko w przeglądarkach.
Oto, co wymyśliłem (nie przetestowane w walce):
Zastosowanie ( demo ):
źródło
let
iconst
. Ponadto, korzystając z twojego rozwiązania, otrzymałem wiele odnośników, któreiframes
nie zostały użyte w dokumencie. Zastanów się nad dodaniemdocument.body.removeChild(sandbox)
kodu do przyszłych czytników opartych na makaronie.Z jQuery możesz po prostu pobrać go za pomocą
źródło
Poniższy kod pozwala zachować niektóre tagi HTML podczas usuwania wszystkich pozostałych
źródło
phpjs
). Jeśli użyjeszallowed
param, jesteś podatny na XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
return<p onclick="alert(1)">mytext</p>
Możliwe jest również użycie fantastycznego parsera HTML JS HTML htmlparser2 . Oto działające demo:
Wyjście będzie
This is a simple example.
Zobacz to w akcji tutaj: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Działa to zarówno w węźle, jak i przeglądarce, jeśli spakujesz aplikację internetową za pomocą narzędzia takiego jak webpack.
źródło
Musiałem tylko usunąć
<a>
tagi i zastąpić je tekstem linku.To wydaje się działać świetnie.
źródło
title="..."
.Dla łatwiejszego rozwiązania spróbuj tego => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
źródło
Sam stworzyłem działające wyrażenie regularne:
źródło
prosta 2-liniowa jquery do usunięcia HTML.
źródło
Zaakceptowana odpowiedź działa dobrze, jednak w IE, jeśli
html
ciąg jestnull
w postaci"null"
(zamiast „”). Naprawiony:źródło
Za pomocą Jquery:
źródło
input
element obsługuje tylko jeden tekst liniowy :Aktualizacja: działa zgodnie z oczekiwaniami
źródło
Zdefiniuj to jako wtyczkę jquery i użyj jej w następujący sposób:
źródło