-2

为什么我会收到警报框

    $(function() {  
      $('#users').each(function() {  
        var select = $(this);  
        var option = select.children('option').first();  
        select.after(option.text());  
        select.hide();  
      });  
    });  
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="users" name="users">  
    <option value="bad">&lt;script&gt;alert(&#x27;xss&#x27;);&lt;/script&gt;</option>  
</select>  

虽然我(&lt;script&gt;alert(&#x27;xss&#x27;);&lt;/script&gt;)在选项文本中有编码版本??

我试图阻止显示警报,因为我在选项文本中编码了 html。有人可以告诉我我错过了什么吗?

https://jsfiddle.net/hf1fbhmg/

4

1 回答 1

0

我在选项文本中编码了 html。

这无关紧要,因为您正在获得它的文本表示形式(使用text())。(即使您获得的是 HTML 表示,浏览器如何将 DOM 中的文本转换回 HTML 的规则也可能会给您带来意想不到的结果)。

然后你使用select.after(that_text);. 如果你传递一个看起来像 HTML(你是)的字符串,after那么 jQuery 会将它视为 HTML。您需要明确地将其视为文本。

例如:

select.after(
    jQuery("<span />").text(that_text)
);
于 2016-03-25T23:01:19.513 回答