Estou produzindo valores de um banco de dados (não é realmente aberto à entrada pública, mas é aberto à entrada por um usuário na empresa - ou seja, não estou preocupado com o XSS ).
Estou tentando gerar uma tag como esta:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION é realmente um valor do banco de dados que é algo como isto:
Prelim Assess "Mini" Report
Eu tentei substituir "por", mas não importa o que eu tente, o Firefox continua cortando minha chamada de JavaScript após o espaço após a palavra Avaliação , e está causando todos os tipos de problemas.
Devo confundir a resposta óbvia, mas pela minha vida não consigo descobrir.
Alguém quer apontar minha idiotice?
Aqui está toda a página HTML (será uma página ASP.NET eventualmente, mas, para resolver isso, retirei todo o resto, exceto o código do problema)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
javascript
quotes
escaping
Matt Dawdy
fonte
fonte
onclick
anexo do seu evento discreto e mover todas as informações do banco de dados para um console de dados. As coisas ficarão mais limpas e você realmente receberá algum tipo de erro de sintaxe quando suas seqüências de caracteres forem escapadas incorretamente.Respostas:
Você precisa escapar da string em que está escrevendo para
DoEdit
eliminar os caracteres de aspas duplas. Eles estão fazendo com que oonclick
atributo HTML seja fechado prematuramente.O uso do caractere de escape JavaScript,,
\
não é suficiente no contexto HTML. Você precisa substituir as aspas duplas pela representação apropriada da entidade XML"
,.fonte
'mystring'.replace(/"/g, '"');
"
funcionaria nesse caso específico, como sugerido antes de mim, por causa do contexto HTML.No entanto, se você deseja que seu código JavaScript seja escapado independentemente para qualquer contexto, você pode optar pela codificação JavaScript nativa:
'
torna-\x27
"
se\x22
Assim, o seu onclick se tornaria:
DoEdit('Preliminary Assessment \x22Mini\x22');
Isso funcionaria, por exemplo, também ao passar uma string JavaScript como parâmetro para outro método JavaScript (
alert()
é um método de teste fácil para isso).Estou lhe referindo à pergunta duplicada Stack Overflow: Como escapar uma string dentro do código JavaScript dentro de um manipulador onClick? .
fonte
"
, obviamente, funcione."
é necessário nos valores de entrada, ou seja,<input value="\x22quoted string\x22">
não funcionará.onclick="..."
). O valor de umvalue
atributo não está sendo processado em um contexto JavaScript, apenas em um contexto HTML.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Deve fazer o truque.
fonte
Pessoal, já existe a
unescape
função em JavaScript que faz o escape para\"
:fonte
O problema é que o HTML não reconhece o caractere de escape. Você pode contornar isso usando aspas simples para o atributo HTML e aspas duplas para o onclick.
fonte
É assim que eu faço, basicamente
str.replace(/[\""]/g, '\\"')
.fonte
Se você estiver montando o HTML em Java, poderá usar esta boa classe de utilitário do Apache commons-lang para fazer todo o escape corretamente:
fonte
Eu fiz uma amostra usando jQuery
E isso funciona no Internet Explorer e Firefox.
fonte
Você pode copiar essas duas funções (listadas abaixo) e usá-las para escapar / remover todas as aspas e caracteres especiais. Você não precisa usar o jQuery ou qualquer outra biblioteca para isso.
fonte
Por favor, encontre o código abaixo que escapa as aspas simples como parte da string inserida usando uma expressão regular. Ele valida se a sequência inserida pelo usuário é separada por vírgulas e, ao mesmo tempo, escapa até as aspas simples inseridas como parte da sequência.
Para escapar de aspas simples, basta inserir uma barra invertida seguida por uma aspas simples como: \ ' como parte da sequência. Eu usei o validador jQuery para este exemplo, e você pode usar conforme sua conveniência.
Exemplos de strings válidos:
'Olá'
'Olá Mundo'
'Olá Mundo'
'Olá Mundo',' '
'É o meu mundo', 'Não é possível aproveitar isso sem mim.', 'Bem-vindo, Visitante'
HTML:
JavaScript:
fonte
Fuja do espaço em branco também. Parece-me que o Firefox está assumindo três argumentos em vez de um.
é o caractere de espaço sem quebra. Mesmo que não seja o problema, ainda pode ser uma boa ideia.fonte
Você precisa escapar de aspas com barras invertidas duplas.
Isso falha (produzido pelo json_encode do PHP ):
Isso funciona:
fonte
Você pode usar os métodos jQuery escape () e unescape (). Como abaixo,
Use
escape(str);
para escapar da string e recuperar novamente usandounescape(str_esc);
.fonte