Html 消毒<;脚本>;元素含量

Html 消毒<;脚本>;元素含量,html,xss,sanitization,Html,Xss,Sanitization,假设我想通过动态元素向我的客户机提供一些数据(在第一次响应中,没有延迟) <script><%= payload %></script> 假设payload是字符串var data='alert(“muahahahahaha!”)。一个结束标记()将允许用户向我的页面中插入任意脚本。如何正确清理脚本元素的内容 我想我可以将更改为,并将编辑为数据无突变 如果我理解正确的话。您希望防止用户在用户提交的字符串中过早结束脚本标记。对于html可以这样做,正如您所

假设我想通过动态
元素向我的客户机提供一些数据(在第一次响应中,没有延迟)

<script><%= payload %></script>

假设
payload
是字符串
var data='alert(“muahahahahaha!”)。一个结束标记(
)将允许用户向我的页面中插入任意脚本。如何正确清理脚本元素的内容


我想我可以将
更改为
,并将
编辑为数据无突变

如果我理解正确的话。您希望防止用户在用户提交的字符串中过早结束
脚本
标记。对于html可以这样做,正如您所说的那样,在结尾标记
中添加反斜杠。在这种情况下,这是你唯一应该担心的逃跑。您不需要转义html注释,因为浏览器会将其解释为javascript的一部分。也许,如果一些较旧的浏览器不能正确解释脚本标记的默认类型
text/javascript
language=“javascript”
,不推荐使用),那么可能需要添加
type='text/javascript'



根据Mike Samuel的回答,我可能错了,不需要逃避html注释。但是,我无法在chrome或chrome中复制它。

假设您正在这样做:

有效载荷设置为

var data = '[this is user controlled data]';
其余的代码(赋值、引号和分号)由应用程序生成,然后需要的编码是十六进制实体编码

有关更多信息,请参阅。这将转换为

</script><script>alert("Muahahaha!")
尝试此方法,您将看到此方法的优点是无论包含什么字符,都能准确地存储用户集字符串。此外,它还负责单引号和双引号编码。作为超级奖励,它还适合存储在HTML属性中:

<a onclick="alert('[user data]');" />

上述规定仍然适用。当值插入到JSON中时,由JSON类正确地对其进行十六进制实体编码。在类之外很难做到这一点,因为您必须再次有效地解析JSON以确定当前的语言上下文。我不建议使用在
中转义正斜杠的简单选项,因为还有其他可以结束语法上下文的序列,例如。正确地转义,您的代码将是经得起未来考验的安全代码。

服务器端使用的是什么语言?将数据编码为JSON…?当然有一些东西需要解释。也就是说,json如何神奇地转义html?当然不是。几乎每个框架都有使字符串html安全的方法,但仅仅说“json将修复它”是完全错误的。@ChristianVarga OP并不担心字符串会被终止,他担心标记会被终止。即使没有注入“关闭报价”。这里有人遇到了由此产生的问题。那是2009年,也许从那以后浏览器变得更智能了,我不知道该说什么。这里给出了一个解决方案。我的首选解决方案不是像这样传递数据,而是将其放在
data
属性或隐藏字段中,但我想这并不能回答问题。这会使字符串安全,但也会改变我的数据。我不一定想那样做;如果我的负载中的JS对象有一个字符串属性,其中包含
&
,现在如果我重新保存数据,它将变成
&,然后下次我检索它时,它会变成
&;amp,等等。编码过程不能影响数据的完整性。我不希望数据发生变异。删除数据也是一种变异形式。原始帖子暗示违反规则#0,因为这似乎是直接注入脚本标记。否则,你的回答对我来说是有意义的。我的回答是假设
var data='
位是由可信代码生成的,这里只有字符串文字是由用户控制的。抱歉,OP中的示例应该尽可能简单。我的数据实际上是字符串化的JSON,例如
var data={“foo”:“},其中模板为
var data=
<a onclick="alert('[user data]');" />
var data = <%= JSON.stringify(data) %>;