Existe uma maneira fácil de pegar uma string de html em JavaScript e remover o html?
javascript
html
string
Bryan
fonte
fonte
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
fonte
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
se você estiver injetando viadocument.write
ou concatenando com uma string que contém a>
antes de injetar viainnerHTML
.>
restante será deixado no segundo. Isso não representa um risco de injeção. O risco ocorre devido à<
esquerda no primeiro, o que faz com que o analisador HTML esteja em um contexto diferente do estado dos dados quando o segundo é iniciado. Observe que não há transição do estado dos dados>
.<button onClick="dostuff('>');"></button>
Assumindo HTML corretamente escrito, você ainda precisa levar em conta que um sinal maior que pode estar em algum lugar no texto citado em um atributo. Além disso, você deseja remover todo o texto dentro das<script>
tags, pelo menos.Maneira mais simples:
Isso recupera todo o texto de uma string de html.
fonte
Eu gostaria de compartilhar uma versão editada da resposta aprovada do Shog9 .
Como Mike Samuel apontou com um comentário, essa função pode executar códigos javascript embutidos.
Mas Shog9 está certo ao dizer "deixe o navegador fazer isso por você ..."
então .. aqui minha versão editada, usando DOMParser :
aqui o código para testar o javascript embutido:
Além disso, ele não solicita recursos na análise (como imagens)
fonte
Como uma extensão do método jQuery, se a sua string não puder conter HTML (por exemplo, se você estiver tentando remover HTML de um campo de formulário)
retornará uma string vazia se não houver HTML
Usar:
em vez de.
Atualização: Como foi indicado nos comentários, em algumas circunstâncias esta solução executará javascript contido
html
se o valor dehtml
puder ser influenciado por um invasor, use uma solução diferente.fonte
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Convertendo HTML para email de texto sem formatação, mantendo os hiperlinks (a href) intactos
A função acima postada pelo hipóxido funciona bem, mas eu estava atrás de algo que basicamente convertia o HTML criado em um editor Web RichText (por exemplo, FCKEditor) e limpava todo o HTML, mas deixava todos os links devido ao fato de que eu queria tanto o HTML quanto o HTML. a versão em texto sem formatação para ajudar a criar as partes corretas para um email do STMP (HTML e texto sem formatação).
Depois de muito tempo pesquisando no Google, eu e meus colegas descobrimos isso usando o mecanismo de expressão regular em Javascript:
a
str
variável começa assim:e depois que o código foi executado, fica assim: -
Como você pode ver, todo o HTML foi removido e o Link foi mantido com o texto com hiperlink ainda intacto. Também substituí as tags
<p>
e<br>
por\n
(newline char) para que algum tipo de formatação visual seja mantida.Para alterar o formato do link (por exemplo
BBC (Link->http://www.bbc.co.uk)
), basta editar o$2 (Link->$1)
, onde$1
está o URL / URI href e o$2
texto com hiperlink. Com os links diretamente no corpo do texto sem formatação, a maioria dos clientes de email SMTP os converte para que o usuário possa clicar neles.Espero que você ache isso útil.
fonte
Uma melhoria na resposta aceita.
Dessa forma, algo funcionando assim não fará mal:
Firefox, Chromium e Explorer 9+ são seguros. O Opera Presto ainda é vulnerável. As imagens mencionadas nas seqüências também não são baixadas no Chromium e Firefox, salvando solicitações http.
fonte
<script><script>alert();
Isso deve funcionar em qualquer ambiente Javascript (NodeJS incluído).
fonte
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
Eu alterei a resposta de Jibberboy2000 para incluir vários
<BR />
formatos de tag, remova tudo dentro<SCRIPT>
e<STYLE>
etiquetas, formatar o HTML resultante, removendo várias quebras de linha e espaços e converter alguns códigos HTML-codificado em normal. Após alguns testes, parece que você pode converter a maioria das páginas da Web completas em texto simples, onde o título e o conteúdo da página são mantidos.No exemplo simples,
torna-se
A função JavaScript e a página de teste têm esta aparência:
Foi usado com este HTML:
fonte
/<p.*>/gi
deveria ser/<p.*?>/gi
.<br>
tags que você poderia usar uma boa expressão regular em vez disso:/<br\s*\/?>/
de que maneira você tem apenas uma substituição em vez de 3. Além disso, parece-me que, exceto para a decodificação de entidades que você pode ter um único regex, algo como isto:/<[a-z].*?\/?>/
.Esta é uma versão regex, que é mais resistente a HTML malformado, como:
Tags não fechadas
Some text <img
"<", ">" dentro dos atributos da tag
Some text <img alt="x > y">
Novas linhas
Some <a href="http://google.com">
O código
fonte
Outra solução, reconhecidamente menos elegante que a do nickf ou do Shog9, seria percorrer recursivamente o DOM começando na tag <body> e anexando cada nó de texto.
fonte
Se você deseja manter os links e a estrutura do conteúdo (h1, h2, etc), verifique TextVersionJS Você pode usá-lo com qualquer HTML, embora tenha sido criado para converter um email em HTML em texto sem formatação.
O uso é muito simples. Por exemplo em node.js:
Ou no navegador com js puro:
Também funciona com o require.js:
fonte
Depois de tentar todas as respostas mais mencionadas, se não todas, elas tiveram casos extremos e não conseguiram atender completamente minhas necessidades.
Comecei a explorar como o php faz isso e me deparei com a lib php.js, que replica o método strip_tags aqui: http://phpjs.org/functions/strip_tags/
fonte
allowed == ''
que eu acho que é o que o OP pediu, que é quase o que Byron respondeu abaixo (Byron só tem o[^>]
errado.)allowed
param você está vulnerável a XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
retornos<p onclick="alert(1)">mytext</p>
É responsável por> atributos internos e
<img onerror="javascript">
por elementos dom recém-criados.uso:
demo:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
demonstração da resposta principal fazendo as coisas terríveis:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
fonte
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
).Muitas pessoas já responderam isso, mas achei que seria útil compartilhar a função que escrevi que retira as tags HTML de uma string, mas permite incluir uma matriz de tags que você não deseja remover. É bem curto e tem funcionado muito bem para mim.
fonte
Eu acho que a maneira mais fácil é usar expressões regulares como alguém mencionado acima. Embora não haja motivo para usar um monte deles. Tentar:
fonte
[^<>]
com[^>]
porque uma tag válida não pode incluir um<
caractere e a vulnerabilidade XSS desaparece.Fiz algumas modificações no script Jibberboy2000 original Espero que seja útil para alguém
fonte
Aqui está uma versão que aborda as preocupações de segurança de @ MikeSamuel:
Observe que ele retornará uma string vazia se a marcação HTML não for XML válido (ou seja, as tags devem ser fechadas e os atributos devem ser citados). Isso não é o ideal, mas evita a questão de ter o potencial de explorar a segurança.
Se não é necessário ter uma marcação XML válida, você pode tentar usar:
mas essa não é uma solução perfeita por outras razões.
fonte
Você pode remover com segurança as tags html usando o atributo sandbox iframe .
A idéia aqui é que, em vez de tentar regexar nossa string, aproveitamos o analisador nativo do navegador injetando o texto em um elemento DOM e consultando a propriedade
textContent
/innerText
desse elemento.O elemento mais adequado para injetar nosso texto é um iframe em área restrita, para impedir qualquer execução arbitrária de código (também conhecido como XSS ).
A desvantagem dessa abordagem é que ela só funciona em navegadores.
Aqui está o que eu criei (Não testado em batalha):
Uso ( demo ):
fonte
let
econst
. Além disso, usando sua solução, tenho muitas referências deiframes
não usadas dentro do documento. Considere adicionar umdocument.body.removeChild(sandbox)
no código para futuros leitores baseados em pasta de cópia.Com o jQuery, você pode simplesmente recuperá-lo usando
fonte
O código abaixo permite que você retenha algumas tags html enquanto remove todas as outras
fonte
phpjs
). Se você usar oallowed
param você está vulnerável a XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
retornos<p onclick="alert(1)">mytext</p>
Também é possível usar o fantástico analisador HTML HTML puro htmlparser2 . Aqui está uma demonstração de trabalho:
A saída será
This is a simple example.
Veja em ação aqui: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Isso funciona no nó e no navegador se você compactar seu aplicativo da Web usando uma ferramenta como o webpack.
fonte
Eu só precisava tirar o
<a>
tags e substituí-las pelo texto do link.Isso parece funcionar muito bem.
fonte
title="..."
.Para uma solução mais fácil, tente isso => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
fonte
Eu mesmo criei uma expressão regular de trabalho:
fonte
jquery simples de 2 linhas para remover o html.
fonte
A resposta aceita funciona bem principalmente, no entanto, no IE, se a
html
string é a quenull
você obtém"null"
(em vez de ''). Fixo:fonte
Usando o Jquery:
fonte
input
O elemento suporta apenas um texto de linha :Atualização: isso funciona conforme o esperado
fonte
Defina isso como um plug-in jquery e use-o da seguinte maneira:
fonte