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>
Author: Peter Mortensen, 2010-01-05

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, &quot;.

 214
Author: Aaron, 2015-05-04 17:05:03

&quot; 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

Para que o teu onclick se tornasse:
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).

Estou a referir-me à pergunta duplicada sobre o excesso de pilha., como é que escapo a um código JavaScript dentro de um controlador de onClick?.
 97
Author: tsemer, 2017-05-23 12:10:28
<html>
    <body>
        <a href="#" onclick="DoEdit('Preliminary Assessment &quot;Mini&quot;'); return false;">edit</a>
    </body>
</html>
Deve ser suficiente.
 33
Author: kristian, 2010-01-05 05:27:25

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>
 24
Author: rohtakdev, 2015-05-04 17:08:57

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>
 12
Author: dl., 2015-05-04 17:06:00
É assim que eu faço, basicamente.

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>
 6
Author: Ronnie Royston, 2016-05-31 00:08:55

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.

 2
Author: iTake, 2015-05-04 17:09:41

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.
 1
Author: rahul, 2015-05-04 17:05:28

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, '\\');
}
 1
Author: omanosoft, 2020-02-28 22:50:30

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.');
 1
Author: Dinesh Lomte, 2020-02-28 22:57:46
Escapar também de espaços em branco. Parece-me que o Firefox está a assumir três argumentos em vez de um. &nbsp; é o carácter de espaço sem quebra. Mesmo que não seja o problema todo, pode ser uma boa ideia.
 0
Author: the Hampster, 2015-05-04 17:07:34
Tens de escapar às aspas com duas voltinhas.

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>
 0
Author: Buffalo, 2017-03-22 14:50:55

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);.

 0
Author: Abhiram, 2020-02-28 22:53:13