Aspas de Escape no JavaScript
estou a extrair valores de uma base de dados (não está realmente aberta a entrada pública, mas está aberta a entrada por um utilizador na empresa -- o que significa que não estou preocupado com XSS).
estou a tentar emitir uma etiqueta como esta:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
a descrição é na verdade um valor da base de dados que é algo como isto:
Prelim Assess "Mini" Report
Tentei substituir " por\", mas não importa o que tente, o Firefox continua a cortar a minha chamada JavaScript depois do espaço a palavra avalia, e está a causar todo o tipo de problemas.
Tenho de lamentar a resposta óbvia, mas, pela minha vida, não consigo perceber.
Alguém quer apontar a minha idiotice?
Aqui está toda a página HTML (será um ASP.NET página eventualmente, mas para resolver isto eu tirei tudo o resto, menos o código do problema.
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
13 answers
Tens de escapar ao texto que estás a escrever em {[[0]} para apagar os caracteres de aspas duplas. Eles estão fazendo com que o atributo onclick
HTML feche prematuramente.
Usar o carácter de escape JavaScript, \
, não é suficiente no contexto HTML. Você precisa substituir a citação dupla com a representação de entidade XML adequada, "
.
"
funcionaria neste caso particular, como sugerido antes de mim, por causa do contexto HTML.
No entanto, se quiser que o seu código de JavaScript seja escapado independentemente para qualquer contexto, poderá optar pela codificação de JavaScript nativa:'
torna-se \x27
"
torna-se \x22
DoEdit('Preliminary Assessment \x22Mini\x22');
Isto também funcionaria, por exemplo, ao passar uma cadeia de JavaScript como um parâmetro para outro método de JavaScript (alert()
é fácil método de ensaio para este efeito).
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a>
</body>
</html>
Deve ser suficiente.
Amigos, já existe a função unescape
em JavaScript que faz a revelação para \"
:
<script type="text/javascript">
var str="this is \"good\"";
document.write(unescape(str))
</script>
O problema é que o HTML não reconhece o carácter de escape. Você poderia trabalhar em torno disso usando as aspas simples para o atributo HTML e as aspas duplas para o onclick.
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
var display = document.getElementById('output');
var str = 'class="whatever-foo__input" id="node-key"';
display.innerHTML = str.replace(/[\""]/g, '\\"');
//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>
Se você está montando o HTML em Java, você pode usar esta classe de utilitário agradável do Apache commons-lang para fazer toda a fuga corretamente:
Org.Apache.comuns.idioma.Stringescapeutils Escapes and unescapes Strings for Java, Java Script, HTML, XML, and SQL.
Fiz uma amostra com jQuery
var descr = 'test"inside"outside';
$(function(){
$("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');
});
function DoEdit(desc)
{
alert ( desc );
}
E isto funciona no Internet Explorer e no Firefox.
Você pode copiar essas duas funções (listadas abaixo), e usá-las para escapar/ignorar todas as citações e caracteres especiais. Não tens de usar o jQuery ou qualquer outra biblioteca para isto.
function escape(s) {
return ('' + s)
.replace(/\\/g, '\\\\')
.replace(/\t/g, '\\t')
.replace(/\n/g, '\\n')
.replace(/\u00A0/g, '\\u00A0')
.replace(/&/g, '\\x26')
.replace(/'/g, '\\x27')
.replace(/"/g, '\\x22')
.replace(/</g, '\\x3C')
.replace(/>/g, '\\x3E');
}
function unescape(s) {
s = ('' + s)
.replace(/\\x3E/g, '>')
.replace(/\\x3C/g, '<')
.replace(/\\x22/g, '"')
.replace(/\\x27/g, "'")
.replace(/\\x26/g, '&')
.replace(/\\u00A0/g, '\u00A0')
.replace(/\\n/g, '\n')
.replace(/\\t/g, '\t');
return s.replace(/\\\\/g, '\\');
}
Encontre por favor o código abaixo, que escapa às aspas simples como parte do texto introduzido, usando uma expressão regular. Valida se o texto introduzido pelo utilizador estiver separado por vírgulas e, ao mesmo tempo, escapa a qualquer citação(s) introduzida (s) como parte do texto.
Para escapar a citações simples, basta introduzir uma barra para trás seguida por uma única citação como: \' como parte da corda. Eu usei o jQuery validator para este exemplo, e você pode usar de acordo com o seu conveniência.Exemplos De Texto Válidos:
'Olá'
'Olá', 'Mundo'
'Olá', 'Mundo'
'Olá', 'Mundo', '
É o meu mundo, não posso desfrutar disto sem mim.', 'Bem-Vindo, Convidado'HTML:
<tr>
<td>
<label class="control-label">
String Field:
</label>
<div class="inner-addon right-addon">
<input type="text" id="stringField"
name="stringField"
class="form-control"
autocomplete="off"
data-rule-required="true"
data-msg-required="Cannot be blank."
data-rule-commaSeparatedText="true"
data-msg-commaSeparatedText="Invalid comma separated value(s).">
</div>
</td>
JavaScript:
/**
*
* @param {type} param1
* @param {type} param2
* @param {type} param3
*/
jQuery.validator.addMethod('commaSeparatedText', function(value, element) {
if (value.length === 0) {
return true;
}
var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$");
return expression.test(value);
}, 'Invalid comma separated string values.');
é o carácter de espaço sem quebra. Mesmo que não seja o problema todo, pode ser uma boa ideia.
Isto falha (produzido pelo PHP ' s json_encode):
<script>
var jsonString = '[{"key":"my \"value\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
Isto funciona:
<script>
var jsonString = '[{"key":"my \\"value\\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
Você pode usar os métodos de escape() e unescape() jQuery. Como em baixo,
Use escape(str);
para escapar do texto e recuperar novamente usando unescape(str_esc);
.