代码之家  ›  专栏  ›  技术社区  ›  Matt Dawdy

JavaScript中的转义引号

  •  192
  • Matt Dawdy  · 技术社区  · 16 年前

    XSS ).

    <a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
    

    DESCRIPTION实际上是数据库中的一个值,如下所示:

    Prelim Assess "Mini" Report
    

    评估 ,并引发了各种各样的问题。

    我一定错过了一个显而易见的答案,但就我个人而言,我无法找到答案。

    有人愿意指出我的白痴吗?

    这是整个HTML页面(它将是一个 ASP.NET

    <html>
        <body>
            <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
        </body>
    </html>
    
    11 回复  |  直到 6 年前
        1
  •  222
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    您需要对正在写入的字符串进行转义 DoEdit 删除双引号字符。他们造成了灾难 onclick 要提前关闭的HTML属性。

    使用JavaScript转义字符, \ &quot; .

        2
  •  102
  •   Community Mohan Dere    9 年前

    &quot; 正如我之前所建议的那样,由于HTML上下文的原因,在这种特殊情况下可以工作。


    ' 变成 \x27
    " 变成 \x22


    DoEdit('Preliminary Assessment \x22Mini\x22');

    例如,当将一个JavaScript字符串作为参数传递给另一个JavaScript方法时,这也会起作用( alert() 这是一种简单的测试方法)。

    我指的是重复堆栈溢出问题, How do I escape a string inside JavaScript code inside an onClick handler?

        3
  •  33
  •   kristian    16 年前
    <html>
        <body>
            <a href="#" onclick="DoEdit('Preliminary Assessment &quot;Mini&quot;'); return false;">edit</a>
        </body>
    </html>
    

    我们应该做到这一点。

        4
  •  24
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    伙计们,已经有 unescape JavaScript中的函数,该函数对 \"

    <script type="text/javascript">
        var str="this is \"good\"";
        document.write(unescape(str))
    </script>
    
        5
  •  13
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    问题是HTML无法识别转义字符。您可以通过对HTML属性使用单引号,对onclick使用双引号来解决这个问题。

    <a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
    
        6
  •  9
  •   Ronnie Smith    10 年前

    str.replace(/[\""]/g, '\\"') .

    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>
        7
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    org.apache.commons.lang.StringEscapeUtils
    逃避和逃避 用于Java、Java脚本、HTML、XML和SQL的字符串。

        8
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    var descr = 'test"inside"outside';
    $(function(){
       $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');       
    });
    
    function DoEdit(desc)
    {
        alert ( desc );
    }
    

    这在InternetExplorer和Firefox中有效。

        9
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    6 年前

    您可以复制这两个函数(如下所列),并使用它们转义/取消转义所有引号和特殊字符。您不必为此使用jQuery或任何其他库。

    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, '\\');
    }
    
        10
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    6 年前

    请在下面的代码中找到,它使用正则表达式将单引号转义为输入字符串的一部分。它验证用户输入的字符串是否以逗号分隔,同时它甚至会转义作为字符串一部分输入的任何单引号。

    \ 作为字符串的一部分。我在这个示例中使用了jQuery验证器,您可以根据自己的方便使用它。

    有效字符串示例:

    “你好”

    “你好”,“世界”

    “你好”,“世界”

    “你好”,“世界”,“世界”

    “这是我的世界”,“没有我我无法享受这一切”,“欢迎光临,客人”

    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>
    

         /**
     *
     * @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.');
    
        11
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    &nbsp; 是不间断空格字符。即使这不是问题的全部,也可能是个好主意。

        12
  •  0
  •   Buffalo    9 年前

    您需要用双反斜杠转义引号。

    这失败了(由PHP的 json_encode

    <script>
      var jsonString = '[{"key":"my \"value\" "}]';
      var parsedJson = JSON.parse(jsonString);
    </script>
    

    这项工作:

    <script>
      var jsonString = '[{"key":"my \\"value\\" "}]';
      var parsedJson = JSON.parse(jsonString);
    </script>
    
        13
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    6 年前

    使用 escape(str); 要转义字符串并使用 unescape(str_esc); .