Javascript评论(和朋友)

Chr*_*ian 8 javascript server-response eval

有人声称评价是邪恶的.

任何常规HTML页面可能如下所示:

        <script src="some-trendy-js-library.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

也就是说,假设这样做的人知道他的工作,并在页面末尾加载javascript.

在这里,我们基本上将脚本文件加载到Web浏览器中.有些人已经深入了解并将其用作与第三方服务器通信的方式......

<script src="//foo.com/bar.js"></script>
Run Code Online (Sandbox Code Playgroud)

此时,无论出于何种原因,已经发现在运行时有条件地加载这些脚本是很重要的.

我的观点是什么?虽然机制不同,但我们正在做同样的事情......执行一段纯文本作为代码 - 又名eval().


现在我已经说清楚了,这就是问题......

鉴于某些条件,例如AJAX请求,或(更有趣的是)websocket连接,从服务器执行响应的最佳方法是什么?

这是一对让你思考的事情......

  • eval()服务器的输出.(那边那个家伙晕了吗?)
  • 运行服务器返回的命名函数: var resp = sock.msg; myObj[resp]();
  • 构建我自己的解析器,以弄清楚服务器试图告诉我什么,而不直接搞乱javascript.

Fer*_*yer 5

"邪恶"并不意味着"禁止".有时,使用所谓的"邪恶"特征有充分的理由.它们被称为"邪恶",因为它们可能并且经常被滥用.

在您的情况下,客户端脚本只允许向"自己的"服务器发出请求.这是原始JavaScript所来自的服务器,因此动态响应与原始代码一样受信任.一个非常有效的场景eval().


Mik*_*uel 5

鉴于某些条件,例如AJAX请求,或(更有趣的是)websocket连接,从服务器执行响应的最佳方法是什么?

eval用于解析消息结果的主要批评是它太过分了 - 你正在使用大锤来攻击苍蝇,其中包含来自过度使用工具的所有额外风险 - 它们可以反弹并击中你.

让我们将各种反应分解为几个不同的类别:

  1. 按需加载静态javascript
  2. 安全通道上受信任来源的动态响应,不包含不受信任方指定的内容.
  3. 来自混合源的动态响应(可能主要是受信任但包括由不受信任方指定的编码字符串),主要是数据
  4. 基于数据的副作用

对于(1),XHR + eval和XHR +之间没有区别<script src>,但XHR + eval几乎没有优势.

对于(2),差别不大.如果您可以使用JSON.parse您解压缩响应可能会遇到更少的问题,但是eval额外的权限不太可能被来自受信任来源的数据滥用,否则如果您有充分的积极理由那么这不是什么大问题.eval.

对于(3),存在很大差异. eval即使你非常小心,超额可滥用的权威也可能会惹恼你.这在安全方面是脆弱的.不要这样做.

对于(4),最好将它分成数据问题和代码问题.如果您可以在执行前验证结果,JSONP允许此操作.使用JSON.parse或其他具有很少可滥用权限的数据解析数据,因此您编写并批准用于外部使用的功能会产生副作用.这最大限度地减少了多余的可滥用权限.天真eval在这里很危险.