【问题标题】:Further XSS character escapement explanation进一步的XSS字符转义解释
【发布时间】:2014-07-23 16:43:22
【问题描述】:

所以,我注意到 XSS 主要依赖未转义的尖括号来插入 html 标记。我这里有这段代码:

<!doctype html>
<html lang = 'en'>
<head>
    <meta charset = 'utf-8' />
    <title>XSS Blocker</title>
    <style>
        textarea { width: 400px; height: 300px; margin-left: auto; margin-right: auto }
        #abc { background: white; }
        div { background: blue; }
    </style>
</head>
<body>
    <div id = 'abc'>    

    </div>
    <br>
    <textarea id = 'noXSS'> </textarea> 
    <button type = 'button' id = 'insert'>Insert into page</button>
    <button type = 'button' id = 'toggle'>Disable XSS</button>
</body>

<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script>
$(function() {
var noXSS = false;

function cleanInput(input) {
    return input = input.replace('<','&lt').replace('>','&gt');     
}

$('#toggle').mousedown(function() { 
    noXSS = !noXSS; 
    if (noXSS) { 
        $(this).html('Enable XSS'); 
    }       
    else { 
        $(this).html('Disable XSS'); 
    }  
});

$('#insert').mousedown(function() {
    var text = $('#noXSS').val(); 

    if (noXSS) { text = cleanInput(text) }
    $('#abc').append(text);
    $('#noXSS').val('');
});

});
</script>
</html>

本质上只是在将文本插入网页之前转义了 &lt;&gt; 字符。在一个相关问题 (Escaping &lt; Good Enough to Prevent XSS Attacks) 中,我读到还必须声明字符集(人们无论如何都应该这样做)以防止 UTF-7 XSS,并且还应该转义与号、反斜杠以及单引号和双引号安全字符。

为了更好地理解“额外”字符(&、'、")如何以及为什么可能有害(并且因为学习起来也很有趣),我希望看到劫持我上面的代码使用这些字符的程序。

我知道这不是相当一个问题,更多的是对知识的追求,但我希望没问题。

【问题讨论】:

  • 尝试在Programmers StackExchange 上发布此内容。该站点更多地用于解决现有代码和您的工作。
  • 转义 '" 是为了防止在 HTML 属性中注入。 &amp; 用于正确编码。通常,您不应创建自己的 XSS 过滤器,而应使用本机方法来设置元素的文本或属性。此外,您的 replace 调用只会替换字符串中第一次出现的字符,因此它根本不安全。

标签: javascript regex html escaping xss


【解决方案1】:

处理这个问题的正确方法是设置文本。

$('#abc').text('What <ever> you & want;');

那么,就不需要转义了。

【讨论】:

  • 正确,但前提是 'What &lt;ever&gt; you &amp; want;' 实际上是一个包含 'What &lt;ever&gt; you &amp; want;' 的变量而不是 JavaScript 中的文字文本。否则entity encoding is necessary.
  • @SilverlightFox 这不是真的,但我认为你得到的是所有那些直接将数据回显到 JavaScript 中的人,应该使用 JSON 编码。你可以在你的 JavaScript 代码中放置任何你想要的字符串文字,变量或无变量,只要你正确地转义它......这也是我认为你得到的,但这与是否无关它是一个变量或文字。
  • 是的,这就是我的意思。在您的回答中,它说 What &lt;ever&gt; you &amp; want; 而不是 What &lt;ever&gt; you &amp; want except single quote unless encoded; - 这就是为什么如果已经安全地放在变量中就可以了,但如果您在两个引号字符之间放置您想要的任何内容,则不行。
  • @SilverlightFox 啊,我明白现在的困惑来自哪里了。是的,同意。
【解决方案2】:

为了防止反射和存储的 XSS,您需要对来自服务器的部分响应(输出字段)进行转义/编码。 浏览器页面本身的一些编码可能只对 DOM XSS 有用,但这是一种更罕见的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2019-05-18
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多