客户端javascript的eval和innerHTML的安全性比较?

dan*_*way 19 html javascript

我一直在尝试使用innerHTML来尝试找出我需要在我正在处理的webapp上加强安全性的地方,并且我在Mozilla文档上遇到了一个我没想过的有趣的注入方法.

var name = "<img src=x onerror=alert(1)>";
element.innerHTML = name; // Instantly runs code.
Run Code Online (Sandbox Code Playgroud)

它让我想知道.)如果我应该使用innerHTML,而b.)如果它不是一个问题,为什么我一直在避免其他代码插入方法,特别是eval.

让我们假设我在浏览器上运行javascript客户端,并且我采取必要的预防措施以避免在易于访问的功能中暴露任何敏感信息,并且我已经得到了一些任意指定的点,我已经确定innerHTML不是安全性风险,我已经优化了我的代码,以至于我不一定担心性能受到轻微打击......

我是否通过使用eval创建任何其他问题?除了纯代码注入之外还有其他安全问题吗?

或者,是innerHTML,我应该表现出同样的关心吗?它同样危险吗?

Ben*_*aum 21

TL;博士;

是的,你的假设是正确的.

innerHTML如果您要添加不受信任的代码,则设置容易受到XSS攻击.

(如果你要添加你的代码,这不是一个问题)

考虑使用textContent如果你想添加用户添加的文本,它将逃避它.

问题是什么

innerHTML设置DOM节点的HTML内容.将DOM节点的内容设置为任意字符串时,如果接受用户输入,则易受XSS攻击.

例如,如果您innerHTML根据GET参数的用户输入设置节点."用户A"可以向"用户B"发送一个版本的页面,其中包含"窃取用户数据并通过AJAX发送给我"的HTML.

有关详细信息,请在此处查看此问题

我该怎么做才能减轻它?

如果要设置节点的HTML,您可能需要考虑的是:

  • 使用像Mustache这样具有逃避功能的模板引擎.(它默认会逃避HTML)
  • 使用textContent手动设置节点的文本
  • 不接受用户对文本字段的任意输入,自己清理数据.

有关预防XSS的更一般方法,请参阅此问题.

代码注入一个问题.你不想在接收端.

大象在房间里

这是不是唯一的问题innerHTMLeval.当您更改innerHTMLDOM节点时,您正在销毁其内容节点并改为创建新节点.当你打电话给eval你时,你正在调用编译器.

虽然这里的主要问题显然是不受信任的代码,而且你说性能不是问题,但我仍然觉得我必须提到两者对于他们的选择极其缓慢.


Séb*_*uld 6

快速回答是:你没有想到任何新的东西.如果有的话,你想要一个更好的吗?

<scr\0ipt>alert("XSSed");</scr\0ipt>
Run Code Online (Sandbox Code Playgroud)

最重要的是,触发XSS的方式比你想象的要多.以下所有内容均有效:

  • onerror,onload,onclick,onhover,onblur等...都是有效的
  • 使用字符编码绕过过滤器(上面突出显示的空字节)

eval然而,它属于另一类 - 它是副产品,大多数时候是混淆的.如果你堕落eval而不是堕落innerHTML,那么你就是一个非常非常小的人.

所有这一切的关键是使用解析器清理您的数据,该解析器与笔测试人员发现的内容保持同步.周围有几个.他们绝对需要至少过滤掉OWASP列表中的所有内容 - 这些非常常见.

  • +1为null char ...哦,我的上帝!!!!! 我有一些过滤器来调整我的代码!!!! (2认同)