为啥注入 javascript 代码是个坏主意

Posted

技术标签:

【中文标题】为啥注入 javascript 代码是个坏主意【英文标题】:Why injecting javascript code is a bad idea为什么注入 javascript 代码是个坏主意 【发布时间】:2019-04-07 08:23:24 【问题描述】:

我有一个由 asp.net 开发的网络项目

在我的网络项目中,我有一个称为 (MainPage) 的页面。在 MainPage 根据查询字符串,最后一个用户可以看到调查编辑表(www.a.com?entity=survey@op=edit)或参数插入表(www.a.com?entity=parameter&op=add)或等等……

上面的查询字符串示例只是示例,因为我对它们进行了加密,实际上最后一个用户在 url 上看到了一些复杂的单词

例如:www.a.com?saşlfas571=sflkmlm11sd&13kjn13=1378183

此外,我在 MainPage 中加载了一个名为 MainPageJs 的 javascript,它根据查询字符串显示正确的 js 代码。

我在 MainPage.cshtml 中加载 MainPageJs

@section scripts

<script type="text/javascript" src="@CustomUrl.CustomAction("MainPageJS", "Home", new  entity= entityName, op = opName )"></script>

下面的代码展示了 MainPageJs 是如何工作的

 ....
 string res = "";
 if (queryString == "parameter")
 
       res = "var a = 1;";
 
 if (queryString == "survey")
 
      res = "var a = 2;";
 
 if (queryString == "user")
 
      res = "var a = 3;";
 

 return JavaScript(res.ToString()); 

现在我想知道的是,

    我的代码风格有安全问题吗? 我的网页是否存在安全漏洞? 此样式是否存在 JavaScript 代码注入漏洞?

【问题讨论】:

您可能会在codereview.stackexchange.com 和/或security.stackexchange.com 上得到更好的回复 如果你直接从查询字符串中插入值输入生成的代码,那么你就有一个严重的漏洞。如果您只是在编写静态确定生成代码的示例中的代码,那么您可能是安全的,但有更好的方法来编写此类代码。 【参考方案1】:

我的代码风格有安全问题吗?

没有。在客户端执行的动态代码没有什么问题。至少从安全的角度来看(你仍然应该控制它的性能)

我的网页是否存在安全漏洞?

没有。你不能破坏在客户端上执行动态代码的任何东西。 “动态”代码在同一个沙箱中执行,与您的普通 js 具有相同的权限。

这种风格有javascript代码注入漏洞吗?

有些人使用术语“JavaScript Injection Attack” - 命名$( userInput ).insertAfter( .. ); 的副作用 - 当用户可以从用户输入运行一些javascript(如果userInput 包含&lt;script&gt;...&lt;/script&gt;)但它与动态JS 无关,它更多地是关于动态 HTML。

【讨论】:

【参考方案2】:
Does my code style have any security problems?
Does my web page have any security vulnerability?
Does this style have a JavaScript code injection
vulnerability?

这完全取决于您的 ASP 代码实现。 从您的问题来看,我没有看到大的安全问题。然而, 如果您不熟悉漏洞或安全性,我不推荐代码风格。

这里有一些原因。

    您已将 URL 公开。 即使您对其进行编码,一些躲闪者也会尝试破解它。例如,黑客可以从不同的 URL 解码它。 我宁愿把它藏起来,也不给他们机会。您也可以将 URL 用作搜索引擎更易读的资源。

    如果你不使用框架,你可能需要实现参数过滤以防止注入攻击(SQL,JS)。这需要时间。

    代码很难维护。 由于您的代码与 ASP 和 JS 混合在一起,因此当您的代码较大时,它会变得更加困难,尤其是当您在 ASP 代码中使用 JS 处理 HTML 之类的 View 时。

【讨论】:

【参考方案3】:

如果您正在对客户端进行加密,则用户可以在加密之前实际看到正在发送到应用程序的内容。有一些工具可以监控客户端活动(例如YSlow),具有技术专长的恶意用户可以使用它来检测可能的前端漏洞。请记住永远不要相信用户输入,并且允许用户在您的应用中传递注入代码绝不是一个好的选择。

【讨论】:

以上是关于为啥注入 javascript 代码是个坏主意的主要内容,如果未能解决你的问题,请参考以下文章

在生产 JavaScript 代码中留下“console.log()”调用是个坏主意?

缩小 HTML、CSS 和 Javascript 是个坏主意吗?

为啥没有主键的表是个坏主意?

为啥调用 Process.killProcess(Process.myPid()) 是个坏主意?

为啥 Django 中的只读表单字段是个坏主意?

为啥 Django 中的只读表单字段是个坏主意?