为啥注入 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
包含<script>...</script>
)但它与动态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 是个坏主意吗?