Javascript数据中的XSS

Javascript数据中的XSS,javascript,xss,Javascript,Xss,在使用webapp时,我发现在启动应用程序时,初始数据中可能存在危险字符: <body> <script> var users = [ { id: 1, bio: 'My beautiful bio' }, { id: 2, bio: '</script><script>alert("hello")</script>' } ] </sc

在使用webapp时,我发现在启动应用程序时,初始数据中可能存在危险字符:

<body>
    <script>
        var users = [
            { id: 1, bio: 'My beautiful bio' },
            { id: 2, bio: '</script><script>alert("hello")</script>' }
        ]
    </script>
</body>

变量用户=[
{id:1,个人简历:'我美丽的个人简历'},
{id:2,bio:'alert(“hello”)}
]
这对我来说是个新闻,因为我一直认为,既然XSS攻击存在于JavaScript中,它将被识别为一个字符串,在您真正在DOM中呈现它之前不会有危险,但可以肯定的是,上面的代码是一种有效的攻击

如果我理解正确的话,那么要引导一个带有一些初学者数据的应用程序,您应该在服务器端将所有/任何字符转换为它们所尊重的HTML实体,然后将它们转换回它们的原始字符,以防止在呈现到DOM中时出现双重转义?既然它用引号括起来并且存在于脚本中,为什么解析器不把它当作字符串来处理呢


jshiddle:

您发布的是两个
块。第一个将失败并出现语法错误,第二个将运行
警报()。以下是第一个脚本:

<script>
    var users = [
        { id: 1, bio: 'My beautiful bio' },
        { id: 2, bio: '</script>

变量用户=[
{id:1,个人简历:'我美丽的个人简历'},
{id:2,bio:'
这是第二个:

<script>alert("hello")</script>
警报(“你好”)
字符串
的出现将结束脚本块,而不管它出现在哪个JavaScript上下文中

至于您更广泛的问题,是的,在JavaScript上下文中包含用户提供的文本时,您必须对其进行清理。最简单的方法是使用JSON编码器。JSON编码器通常在JavaScript字符串常量中必须用
\
引用的字符列表中包含
/
。该功能将具有注意到您,因为
将呈现为

任何JSON表达式都是有效的JavaScript对象初始值设定项字符串(或者,如果要求JSON编码器对基本字符串进行编码,则为有效的字符串常量)


最后,如果希望应用程序正常工作,始终应用HTML编码肯定是而不是应该做的事情。必须应用于用户提供的文本的清理类型取决于它所接收到的解析器的语法。您可以对SQL、服务器端日志文件和HTML应用不同的清理,对于JavaScript。

您发布的是两个
块。第一个块将因语法错误而失败,第二个块将运行
警报()
。以下是第一个脚本:

<script>
    var users = [
        { id: 1, bio: 'My beautiful bio' },
        { id: 2, bio: '</script>

变量用户=[
{id:1,个人简历:'我美丽的个人简历'},
{id:2,bio:'
这是第二个:

<script>alert("hello")</script>
警报(“你好”)
字符串
的出现将结束脚本块,而不管它出现在哪个JavaScript上下文中

至于您更广泛的问题,是的,在JavaScript上下文中包含用户提供的文本时,您必须对其进行清理。最简单的方法是使用JSON编码器。JSON编码器通常在JavaScript字符串常量中必须用
\
引用的字符列表中包含
/
。该功能将具有注意到您,因为
将呈现为

任何JSON表达式都是有效的JavaScript对象初始值设定项字符串(或者,如果要求JSON编码器对基本字符串进行编码,则为有效的字符串常量)


最后,如果希望应用程序正常工作,始终应用HTML编码肯定是而不是应该做的事情。必须应用于用户提供的文本的清理类型取决于它所接收到的解析器的语法。您可以对SQL、服务器端日志文件和HTML应用不同的清理,对于JavaScript。

这不是JSON,而是JavaScript。看看这个。HTML解析器首先运行,然后解析出HTML。这意味着它看到第一个,并认为JavaScript块停止在那里。还有一篇关于我在2009年写的这种XSS的博文:这不是JSON,而是JavaScript。看看这个。HTML解析器运行首先,解析出HTML。这意味着它看到了第一个,认为javascript块就停在那里了。这里还有一篇关于这种类型的XSS的博文,我在2009年写过:经过净化的数据会是什么样子?我尝试将其更改为“”,但仍然收到语法错误,尽管攻击被阻止。JSON编码器通常是ki吗您使用库的目的是什么,或者现代服务器端框架在默认情况下应该这样做?@ncksllvn大多数服务器端环境都有JSON编码器,尽管有时(例如,在Java世界中)不是“标准”的但是,如果仍然出现语法错误,则可能是由于该对象文本末尾缺少
}
(其中包含可疑字符串的一个)@ncksllvn当您在字符串常量中包含反斜杠时,该代码解析得很好。我只是将其复制并粘贴到我的JavaScript控制台中,它就工作了。哇,真不敢相信我错过了这个
}
。不过,这很管用!比使用HTML实体要简单得多。非常感谢。在我认为自己知道很多的任何时候,我都会被提醒我只是触及了表面。经过清理的数据会是什么样子?我尝试将其更改为“”,但仍然收到语法错误,尽管攻击被阻止。JSON编码器通常是那种类型的吗您使用库的目的是什么,或者现代服务器端框架在默认情况下是否应该这样做?@ncksllvn大多数服务器端环境都有JSON编码器,尽管有时(例如,在Java世界中)不作为“标准”工具,而是通过各种广泛可用的附加组件。但是,如果仍然出现语法错误,则可能是由于该对象文本(其中包含可疑字符串的文本)末尾缺少
}
。@ncksllvn wh