如何在HTML属性值中转义引号?

问题描述 投票:37回答:7

我正在构建一行,使用jQuery通过创建一个html字符串插入表中,即

var row = "";
row += "<tr>";
row += "<td>Name</td>";
row += "<td><input value='"+data.name+"'/></td>";
row += "</tr>";

data.name是从ajax调用返回的字符串,可以包含任何字符。如果它包含单引号',它将通过定义属性值的结尾来破坏HTML。

如何确保在浏览器中正确呈现字符串?

javascript html
7个回答
34
投票

您只需要将任何'字符与等效的HTML实体字符代码交换:

data.name.replace(/'/g, "&#39;");

或者,您可以使用jQuery的DOM操作方法创建整个事物:

var row = $("<tr>").append("<td>Name</td><td></td>");
$("<input>", { value: data.name }).appendTo(row.children("td:eq(1)"));

74
投票

实际上,您可能需要这两个功能中的一个(这取决于使用的上下文)。这些函数处理所有类型的字符串引号,并且还可以防止HTML / XML语法。

1. The quoteattr() function for embeding text into HTML/XML:

quoteattr()函数用于上下文中,其中结果不会被javascript计算,但必须由XML或HTML解析器解释,并且必须绝对避免破坏元素属性的语法。

如果生成文本元素的内容,则原生地保留换行符。但是,如果您正在生成属性的值,则一旦设置该值,该指定值将由DOM进行规范化,因此将压缩所有空格(SPACE,TAB,CR,LF),剥离前导和尾随空格并将空白的所有中间序列减少为单个SPACE。

但是有一个例外:CR字符将被保留,不会被视为空格,只有用数字字符引用表示!结果将对所有元素属性有效,但NMTOKEN或ID或NMTOKENS类型的属性除外:引用的CR的存在将使赋值对这些属性无效(例如id =“...” HTML元素的属性):该值无效,DOM将忽略该值。但是在其他属性(CDATA类型)中,由数字字符引用表示的所有CR字符都将被保留而不是规范化。请注意,这个技巧不能保留其他空格(SPACE,TAB,LF),即使它们由NCR表示,因为所有空格的标准化(NCR到CR除外)在所有属性中都是必需的。

请注意,此函数本身不执行任何空格的HTML / XML规范化,因此在生成文本元素的内容时仍然是安全的(在这种情况下不要传递第二个preserveCR参数)。

因此,如果您传递一个可选的第二个参数(其默认值将被视为false)并且该参数的计算结果为true,则当您要生成文字属性值时,将使用此NCR保留换行符,并且此属性为CDATA类型(例如title =“...”属性)而不是类型ID,IDLIST,NMTOKEN或NMTOKENS(例如id =“...”属性)。

function quoteattr(s, preserveCR) {
    preserveCR = preserveCR ? '&#13;' : '\n';
    return ('' + s) /* Forces the conversion to string. */
        .replace(/&/g, '&amp;') /* This MUST be the 1st replacement. */
        .replace(/'/g, '&apos;') /* The 4 other predefined entities, required. */
        .replace(/"/g, '&quot;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        /*
        You may add other replacements here for HTML only 
        (but it's not necessary).
        Or for XML, only if the named entities are defined in its DTD.
        */ 
        .replace(/\r\n/g, preserveCR) /* Must be before the next replacement. */
        .replace(/[\r\n]/g, preserveCR);
        ;
}

警告!此函数仍然不检查源字符串(在Javascript中,只是一个16位代码单元的无限制流),因为它在文件中的有效性必须是有效的纯文本源,并且也是HTML /的有效源。 XML文档。

  • 它应该更新以检测和拒绝(通过例外): 表示分配给非字符的代码点的任何代码单元(如\ uFFFE和\ uFFFF):这是仅对有效纯文本的Unicode要求; 任何错误配对的代理代码单元,形成UTF-16编码代码点的有效对:这是有效纯文本的Unicode要求; 任何有效的代理代码单元对,表示补充平面中的有效Unicode代码点,但分配给非字符(如U + 10FFFE或U + 10FFFF):这是仅对有效纯文本的Unicode要求; 大多数C0和C1控件(范围\ u0000 .. \ u1F和\ u007F .. \ u009F除了TAB和换行符控件):这不是Unicode要求,而是有效HTML / XML的附加要求。
  • 尽管有这种限制,上面的代码几乎就是你想要做的。一般。现代javascript引擎应该在默认系统对象中本机提供此功能,但在大多数情况下,它不能完全确保严格的纯文本有效性,而不是HTML / XML有效性。但是,将从中调用Javascript代码的HTML / XML文档对象应重新定义此本机函数。
  • 在大多数情况下,这种限制通常不是问题,因为源字符串是来自HTML / XML DOM的源字符串计算的结果。
  • 但是如果javascript提取子串并断开代理对,或者它从计算数字源生成文本(将任何16位代码值转换为包含该单代码单元的字符串,并附加这些短字符串或插入),则可能会失败这些短字符串通过替换操作):如果您尝试将编码的字符串插入HTML / XML DOM文本元素或HTML / XML属性值或元素名称,DOM将自己拒绝此插入并将抛出异常;如果你的javascript将结果字符串插入本地二进制文件或通过二进制网络套接字发送,则不会抛出此发射的异常。这样的非纯文本字符串也可以是从二进制文件(例如PNG,GIF或JPEG图像文件)读取的结果,也可以是从二进制安全网络套接字读取的javascript(使得IO流通过16-位代码单元而不仅仅是8位单元:大多数二进制I / O流无论如何都是基于字节的,文本I / O流需要您指定一个字符集来将文件解码为纯文本,以便在文本中找到无效的编码文本流将在您的脚本中抛出I / O异常)。

请注意,此函数,它的实现方式(如果它被扩充以纠正上面警告中提到的限制),也可以安全地用来引用HTML / XML中文字文本元素的内容(以避免离开)来自源字符串值的一些可解释的HTML / XML元素),而不仅仅是文字属性值的内容!所以它应该更好地命名为quoteml(); quoteattr()这个名字只保留传统。

在您的示例中就是这种情况:

data.value = "It's just a \"sample\" <test>.\n\tTry & see yourself!";
var row = '';
row += '<tr>';
row += '<td>Name</td>';
row += '<td><input value="' + quoteattr(data.value) + '" /></td>';
row += '</tr>';

quoteattr()的替代方案,仅使用DOM API:

如果您生成的HTML代码将成为当前HTML文档的一部分,则替代方法是使用文档的DOM方法单独创建每个HTML元素,以便您可以直接通过DOM API设置其属性值,而不是使用单个元素的innerHTML属性插入完整的HTML内容:

data.value = "It's just a \"sample\" <test>.\n\tTry & see yourself!";
var row = document.createElement('tr');
var cell = document.createElement('td');
cell.innerText = 'Name';
row.appendChild(cell);
cell = document.createElement('td');
var input = document.createElement('input');
input.setAttribute('value', data.value);
cell.appendChild(input);
tr.appendChild(cell);
/*
The HTML code is generated automatically and is now accessible in the
row.innerHTML property, which you are not required to insert in the
current document.

But you can continue by appending tr into a 'tbody' element object, and then
insert this into a new 'table' element object, which ou can append or insert
as a child of a DOM object of your document.
*/

请注意,此备选方案不会尝试保留data.value中存在的换行符,因为您生成的是文本元素的内容,而不是此处的属性值。如果你真的想要使用&#13;生成保留换行符的属性值,请参阅第1节的开头和上面quoteattr()中的代码。

2. The escape() function for embedding into a javascript/JSON literal string:

在其他情况下,当意图引用将成为生成的javascript代码片段一部分的字符串时,您将使用下面的escape()函数,您还希望保留该字符串(也可以选择首先由HTML /解析)可以插入更大的javascript代码的XML解析器:

function escape(s) {
    return ('' + s) /* Forces the conversion to string. */
        .replace(/\\/g, '\\\\') /* This MUST be the 1st replacement. */
        .replace(/\t/g, '\\t') /* These 2 replacements protect whitespaces. */
        .replace(/\n/g, '\\n')
        .replace(/\u00A0/g, '\\u00A0') /* Useful but not absolutely necessary. */
        .replace(/&/g, '\\x26') /* These 5 replacements protect from HTML/XML. */
        .replace(/'/g, '\\x27')
        .replace(/"/g, '\\x22')
        .replace(/</g, '\\x3C')
        .replace(/>/g, '\\x3E')
        ;
}

警告!此源代码不会将编码文档的有效性检查为有效的纯文本文档。但是它永远不应该引发异常(除了内存不足的情况):Javascript / JSON源字符串只是不受限制的16位代码单元流,不需要是有效的纯文本或不受HTML / XML文档的限制句法。这意味着代码不完整,也应该替换:

  • 代表C0和C1控制的所有其他代码单元(除了TAB和LF,在上面处理,但可以保持完整而不替换它们)使用\ xNN表示法;
  • 所有分配给Unicode中非字符的代码单元,应使用\ uNNNN表示法替换(例如\ uFFFE或\ uFFFF);
  • 所有代码单元都可用作\ uD800 .. \ DFFF范围内的Unicode代理项,如下所示: 如果它们未正确配对到表示U + 0000..U + 10FFFF全范围内的有效Unicode代码点的有效UTF-16对,则应使用符号\ uDNNN单独替换这些代理代码单元; 否则,如果代码单元对表示的代码点在Unicode纯文本中无效,因为代码点被分配给非字符,则应使用符号\ U00NNNNNN替换这两个代码点;
  • 最后,如果代码单元(或代表补充平面中的代码点的代码单元对)所代表的代码点,如果该代码点被分配或保留/未分配,则在HTML / XML源文档中也是无效的(参见他们的规范),代码点应使用\ uNNNN表示法(如果代码点在BMP中)或\ u00NNNNNN(如果代码点在补充平面中)替换;

另请注意,最后5个替换不是必需的。但是你没有包含它们,你有时需要在某些情况下使用<![CDATA[ ... ]]>兼容性“hack”,例如进一步包括HTML或XML中生成的javascript(参见下面的例子,其中使用了这个“hack”)一个<script>...</script> HTML元素)。

escape()函数的优点是它不插入任何HTML / XML字符引用,结果将首先由Javascript解释,并且它将在运行时稍后保留javascript引擎评估结果字符串时的确切字符串长度。它使您无需在整个应用程序代码中管理混合上下文(请参阅有关它们的最后一节以及相关的安全注意事项)。值得注意的是,如果你在这个上下文中使用quoteattr(),之后评估和执行的javascript将必须显式处理字符引用以重新编码它们,这是不合适的。用例包括:

  1. 当被替换的字符串将插入生成的javascript事件处理程序中时,其中包含一些其他HTML代码,其中javascript片段将包含由文字引号括起的属性。
  2. 当被替换的字符串将成为settimeout()参数的一部分时,该参数稍后将由Javascript引擎进行eval()编辑。

示例1(仅生成JavaScript,不生成HTML内容):

var title = "It's a \"title\"!";
var msg   = "Both strings contain \"quotes\" & 'apostrophes'...";
setTimeout(
    '__forceCloseDialog("myDialog", "' +
        escape(title) + '", "' +
        escape(msg) + '")',
    2000);

例2(生成有效的HTML):

var msg =
    "It's just a \"sample\" <test>.\n\tTry & see yourself!";
/* This is similar to the above, but this JavaScript code will be reinserted below: */ 
var scriptCode =
    'alert("' +
    escape(msg) + /* important here!, because part of a JS string literal */
    '");';

/* First case (simple when inserting in a text element): */
document.write(
    '<script type="text/javascript">' +
    '\n//<![CDATA[\n' + /* (not really necessary but improves compatibility) */
    scriptCode +
    '\n//]]>\n' +       /* (not really necessary but improves compatibility) */
    '</script>');

/* Second case (more complex when inserting in an HTML attribute value): */
document.write(
    '<span onclick="' +
    quoteattr(scriptCode) + /* important here, because part of an HTML attribute */
    '">Click here !</span>');

在第二个示例中,您会看到两个编码函数同时用于JavasSript文字中嵌入的生成文本(使用escape()),生成的JavaScript代码(包含生成的字符串文字)本身再次嵌入,使用quoteattr()重新编码,因为JavaScript代码插入HTML属性(在第二种情况下)。

3. General considerations for safely encoding texts to embed in syntaxic contexts:

总而言之,

  • 生成HTML / XML属性文字的内容时,必须使用quotattr()函数,其中周围的引号在串联中外部添加,以生成完整的HTML / XML代码。
  • 生成JavaScript字符串常量文字的内容时必须使用escape()函数,其中周围引号在串联中外部添加以生成完整的HTML / XML代码。
  • 如果仔细使用,并且在任何地方你会发现变量内容安全地插入到另一个上下文中,并且仅在这些规则下(完全像上面那样实现的函数处理两个上下文中使用的“特殊字符”),你可以通过两者混合多次转义,转换仍然是安全的,并且不需要额外的代码来使用这些文字在应用程序中解码它们。不要使用这些功能。

这些函数仅在那些严格的上下文中是安全的(即quoteattr()只有HTML / XML属性值,而escape()只有Javascript字符串文字)。

还有其他上下文使用不同的引用和转义机制(例如SQL字符串文字,或Visual Basic字符串文字,或正则表达式文字,或CSV数据文件的文本字段,或MIME标头值),每个都需要使用自己独特的转义函数只有在这些情况下:

  • 在首先检查之前,永远不要假设quoteattr()escape()是安全的或不会改变转义字符串的语义,在这些上下文中将原生地理解和支持(分别)HTML / XML属性值或JavaScript字符串文字的语法。
  • 例如,escape()生成的Javascript字符串文字的语法也是合适的,并且在Java编程源代码中使用的字符串文字的两个其他上下文或JSON数据中的文本值中本机支持。

但反过来并非总是如此。例如:

  • 解释最初为除Javascript字符串文字之外的其他上下文(包括PHP源代码中的字符串文字)生成的编码转义文字,对于直接用作Javascript文字并不总是安全的。通过javascript eval()系统函数来解码那些使用escape()未转义的生成的字符串文字,因为那些其他字符串文字可能包含特定于其他初始上下文生成的其他特殊字符,这些特殊字符将被Javascript错误地解释,这可能包括额外的转义例如“\Uxxxxxxxx”,或“\e”,或“${var}”和“$$”,或包含更改引用样式的' + "等附加连接运算符,或“<!--”和“-->”等“透明”分隔符<[DATA[“或”]]>“和”eval()“(可以在支持多个转义语法的不同唯一复杂上下文中找到并安全:请参阅本节最后一段关于混合上下文的内容)。
  • 这同样适用于最初为其他上下文生成的编码转义文字的解释/解码,这些上下文使用标准文本表示形式创建的文档中的HTML / XML属性值(例如,尝试解释为嵌入而生成的字符串文字) HTML / XML文档的非标准二进制格式表示!)
  • 这也将适用于使用quotteattr()的javascript函数escape()进行解释/解码,这些函数仅使用quotteattr()安全地生成以包含在HTML / XML属性文字中,这是不安全的,因为上下文被错误地混合。
  • 这也将适用于使用属性值文字的HTML / XML文本文档解析器进行解释/解码,这些解析器仅使用escape()安全地生成以包含在Javascript字符串文字中,这将是不安全的,因为上下文也被错误地混合。

4. Safely decoding the value of embedded syntaxic literals:

如果你想在上下文中解码或解释字符串文字,那么解码后得到的字符串值将在另一个上下文中不加改变地使用,所以称为混合上下文(例如:首先在HTML / XML中用字符串文字命名一些标识符)使用eval()进行编码;从最初使用{$var}安全编码的字符串中为Javascript命名一些编程变量;依此类推...),您需要准备并使用新的转义函数(这也将检查字符串值的有效性)在编码之前,或者拒绝它,或者截断/简化/过滤它),以及新的解码功能(它也会小心地避免解释有效但不安全的序列,只能在内部接受但不能接受不安全的外部源,这也意味着必须绝对避免使用javascript中的quoteattr()等解码函数来解码JSON数据源,为此你需要使用更安全的原生JSON解码器;本机JSON解码器不会解释有效的Javascript序列,例如在文字表达式,运算符或“quoteattr()”等序列中包含引用分隔符,以强制执行此类映射的安全性!

关于在混合上下文中解码文字的最后考虑因素,只能使用任何语法来安全地编码,以便只保证数据传输的安全性,这对于应用程序或Web服务的安全性至关重要。永远不要在编码位置和解码位置之间混合这些上下文,如果这些位置不属于同一个安全领域(但即使在这种情况下,使用混合上下文总是非常危险,很难在代码中精确跟踪。

出于这个原因,我建议你永远不要在应用程序的任何地方使用或假设混合上下文:而是为单个预处理上下文编写安全的编码和解码函数,该上下文对解码的字符串值具有精确的长度和有效性规则,并且具有精确的长度和有效性规则。编码的字符串字符串文字。禁止那些混合上下文:对于每个上下文的更改,使用另一对匹配的编码/解码函数(该对中使用的函数取决于在其他上下文中嵌入的上下文;并且这对匹配函数也是特定于每个一对上下文)。

这意味着:

  • 要安全地解码最初使用quoteattr()编码的HTML / XML属性值文字,您必须“不”假设它已使用其值取决于定义它的特定DTD的其他命名实体进行编码。您必须初始化HTML / XML解析器以仅支持由unquoteattr生成的少数默认命名字符实体以及可选的数字字符实体(这也是安全的上下文:escape()函数仅生成其中一些但可生成更多这些数字字符引用,但不得生成其他未在默认DTD中预定义的命名字符实体。所有其他命名实体必须被解析器拒绝,因为在要解码的源字符串文字中无效。或者,通过定义unescape()函数(它将拒绝源字符串中任何文字引号的存在,以及不支持的命名实体),您将获得更好的性能。
  • 要安全地解码最初使用eval()编码的Javascript字符串文字(或JSON字符串文字),您必须使用安全的JavaScript unquoteattr()函数,但不能使用不安全的Javascript function unquoteattr(s) { /* Note: this can be implemented more efficiently by a loop searching for ampersands, from start to end of ssource string, and parsing the character(s) found immediately after after the ampersand. */ s = ('' + s); /* Forces the conversion to string type. */ /* You may optionally start by detecting CDATA sections (like `<![CDATA[` ... `]]>`), whose contents must not be reparsed by the following replacements, but separated, filtered out of the CDATA delimiters, and then concatenated into an output buffer. The following replacements are only for sections of source text found *outside* such CDATA sections, that will be concatenated in the output buffer only after all the following replacements and security checkings. This will require a loop starting here. The following code is only for the alternate sections that are not within the detected CDATA sections. */ /* Decode by reversing the initial order of replacements. */ s = s .replace(/\r\n/g, '\n') /* To do before the next replacement. */ .replace(/[\r\n]/, '\n') .replace(/&#13;&#10;/g, '\n') /* These 3 replacements keep whitespaces. */ .replace(/&#1[03];/g, '\n') .replace(/&#9;/g, '\t') .replace(/&gt;/g, '>') /* The 4 other predefined entities required. */ .replace(/&lt;/g, '<') .replace(/&quot;/g, '"') .replace(/&apos;/g, "'") ; /* You may add other replacements here for predefined HTML entities only (but it's not necessary). Or for XML, only if the named entities are defined in *your* assumed DTD. But you can add these replacements only if these entities will *not* be replaced by a string value containing *any* ampersand character. Do not decode the '&amp;' sequence here ! If you choose to support more numeric character entities, their decoded numeric value *must* be assigned characters or unassigned Unicode code points, but *not* surrogates or assigned non-characters, and *not* most C0 and C1 controls (except a few ones that are valid in HTML/XML text elements and attribute values: TAB, LF, CR, and NL='\x85'). If you find valid Unicode code points that are invalid characters for XML/HTML, this function *must* reject the source string as invalid and throw an exception. In addition, the four possible representations of newlines (CR, LF, CR+LF, or NL) *must* be decoded only as if they were '\n' (U+000A). See the XML/HTML reference specifications ! */ /* Required check for security! */ var found = /&[^;])*;?/.match(s); if (found.length >0 && found[0] != '&amp;') throw 'unsafe entity found in the attribute literal content'; /* This MUST be the last replacement. */ s = s.replace(/&amp;/g, '&'); /* The loop needed to support CDATA sections will end here. This is where you'll concatenate the replaced sections (CDATA or not), if you have splitted the source string to detect and support these CDATA sections. Note that all backslashes found in CDATA sections do NOT have the semantic of escapes, and are *safe*. On the opposite, CDATA sections not properly terminated by a matching `]]>` section terminator are *unsafe*, and must be rejected before reaching this final point. */ return s; } 函数!

下面是这两个相关安全解码功能的示例。

5. The unquoteattr() function to parse text embedded in HTML/XML text elements or attribute values literals:

unescape()

请注意,此函数不会解析用于包围HTML属性值的周围引号分隔符。事实上,这个函数可以解码任何HTML / XML文本元素内容,可能包含文字引号,这是安全的。您可以解析HTML代码以提取HTML / XML属性中使用的引用字符串,并在调用function unescape(s) { /* Note: this can be implemented more efficiently by a loop searching for backslashes, from start to end of source string, and parsing and dispatching the character found immediately after the backslash, if it must be followed by additional characters such as an octal or hexadecimal 7-bit ASCII-only encoded character, or an hexadecimal Unicode encoded valid code point, or a valid pair of hexadecimal UTF-16-encoded code units representing a single Unicode code point. 8-bit encoded code units for non-ASCII characters should not be used, but if they are, they should be decoded into a 16-bit code units keeping their numeric value, i.e. like the numeric value of an equivalent Unicode code point (which means ISO 8859-1, not Windows 1252, including C1 controls). Note that Javascript or JSON does NOT require code units to be paired when they encode surrogates; and Javascript/JSON will also accept any Unicode code point in the valid range representable as UTF-16 pairs, including NULL, all controls, and code units assigned to non-characters. This means that all code points in \U00000000..\U0010FFFF are valid, as well as all 16-bit code units in \u0000..\uFFFF, in any order. It's up to your application to restrict these valid ranges if needed. */ s = ('' + s) /* Forces the conversion to string. */ /* Decode by reversing the initial order of replacements */ .replace(/\\x3E/g, '>') .replace(/\\x3C/g, '<') .replace(/\\x22/g, '"') .replace(/\\x27/g, "'") .replace(/\\x26/g, '&') /* These 5 replacements protect from HTML/XML. */ .replace(/\\u00A0/g, '\u00A0') /* Useful but not absolutely necessary. */ .replace(/\\n/g, '\n') .replace(/\\t/g, '\t') /* These 2 replacements protect whitespaces. */ ; /* You may optionally add here support for other numerical or symbolic character escapes. But you can add these replacements only if these entities will *not* be replaced by a string value containing *any* backslash character. Do not decode to any doubled backslashes here ! */ /* Required check for security! */ var found = /\\[^\\])?/.match(s); if (found.length > 0 && found[0] != '\\\\') throw 'Unsafe or unsupported escape found in the literal string content'; /* This MUST be the last replacement. */ return s.replace(/\\\\/g, '\\'); } 函数之前去除那些匹配的引号分隔符。

6. The unescape() function to parse text contents embedded in Javascript/JSON literals:

" = &quot; or &#34;

' = &#39;

请注意,此函数不会解析用于包围Javascript或JSON字符串litterals的周围引号分隔符。您可以解析Javascript或JSON源代码以提取引用的字符串文字,并在调用<div attr="Tim &quot;The Toolman&quot; Taylor" <div attr='Tim "The Toolman" Taylor' <div attr="Tim 'The Toolman' Taylor" <div attr='Tim &#39;The Toolman&#39; Taylor' 函数之前去除那些匹配的引号分隔符。


9
投票
var s = "Tim \"The Toolman\" Taylor";
var s = 'Tim \'The Toolman\' Taylor';

例子:

function escapeAttrNodeValue(value) {
    return value.replace(/(&)|(")|(\u00A0)/g, function(match, amp, quote) {
        if (amp) return "&amp;";
        if (quote) return "&quot;";
        return "&nbsp;";
    });
}

在JavaScript字符串中,使用\来转义引号字符:

$("<a>", { href: 'very<script>\'b"ad' }).text('click me')[0].outerHTML

因此,引用属性值“并使用如下函数:

encodeURIComponent

4
投票

我的答案部分基于Andy E,我仍然建议阅读verdy_p所写的内容,但现在就是这样

decodeURIComponent

免责声明:这不是确切问题的答案,而只是“如何逃避属性”


3
投票

给出的答案看起来相当复杂,所以对于我的用例我已经尝试了内置的'escape()并且发现它们运作良好,根据评论这不会逃避unescape()但是为此你可以使用var row = ""; row += "<tr>"; row += "<td>Name</td>"; row += "<td><input value=\""+data.name+"\"/></td>"; row += "</tr>"; data.name方法代替。


2
投票

我想你可以这样做:

INPUT

如果你担心setValue(data.name)这是现有的单引号。

在最好的情况下,你可以为它创建一个const serialised = _.escape("Here's a string that could break HTML"); // Add it into data-attr in HTML <a data-value-serialised=" + serialised + " onclick="callback()">link</a> // and then at JS where this value will be read: function callback(e) { $(e.currentTarget).data('valueSerialised'); // with a bit of help from jQuery const originalString = _.unescape(serialised); // can be used as part of a payload or whatever. } 元素然后qazxswpoi。


1
投票

使用负载:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.