使用.NET保护SPA中的HTML和JS文件

时间:2014-01-17 22:16:12

标签: javascript asp.net security

我开始使用.NET和Durandal JS开发单页应用程序,我想知道如何保护应用程序的HTML和JS文件。我在谈论App文件夹中的文件,这些文件目前可以通过URL直接访问,我想阻止这个。

当然,由于HTML无论如何都会显示给用户,所以似乎没有必要这样做,但我认为最好还是这样,主要是JS逻辑不受直接访问的影响。我在SPA中查看了一些身份验证示例,其中大多数都是以这种方式公开了一些逻辑。

我该怎么做?如何防止直接访问这些文件?我想用路由映射到控制器中的动作来返回错误,但我认为这样我的javascript也会被阻止。

2 个答案:

答案 0 :(得分:3)

首先,尝试阻止人们在客户端上运行的应用程序中下载和检查客户端代码是徒劳的。如果你给某人某些东西,一台计算机可以在一个人可以访问的系统内执行,某人可以对其进行逆向工程,或者找一个可以的人。通常情况下,唯一一个遭受欺骗和黑客攻击的人是开发人员,他们在浪费时间实现失败的事情,并在调试自己的工作时尝试解决它。​​


如果你真的有兴趣劝阻不经意间偷看你的作品,那么,好吧。

您可以以一种同样混淆的方式minify资产,但所有这一切都会使其暂时不方便(但这种方法在减少页面重量方面仍然很有价值)。有许多工具可以轻松地减少代码。

您可以想出一种方法,即初始页面和脚本引导应用程序的其余部分,方法是要求它在标题中放置一定值,并让HTTP服务器阻止为某些文件提供资源,除非它们有那个头。但是可以轻松地检查,重新创建请求并手动发出请求以避免这种情况。

也许已经做了一些努力来创建一个shell应用程序或浏览器,它只执行您打包成某种加密格式的可信代码,并且可以使用密钥打开。或者也许是一个浏览器插件。我不知道。你可以拿出你想要的任何疯狂的东西,但它值得吗?人们想要使用它吗?如果你让某人很难使用某些东西,他们就不会。


然后,关键是尽量减少您给予客户在您认为无价值和/或商业秘密的机器上运行的内容。你可以制定真正不是那么特别的东西(而且说实话,你的应用程序UI的客户端代码不是真的所有有价值的......不是因为你没有创造一些东西很棒,但代码只是达到目的的手段)并选择正确的技术方法来提供这种服务,但要将其从人们手中夺走。

因此,如果您对商业模式有一些特殊的调味品,请不要在客户端实施。将问题分为客户责任和服务器职责。将客户端限制为基本UI,从用户获取信息,发送到服务器以及显示响应。把你的秘密酱放在他们看不到它的服务器上。

您无需将其设为SPA ...只需将其作为标准的ASP.NET WebForms或MVC即可完成。如果您使用SPA,您必须购买其固有的原则。

如果那是不可能的,并且所有逻辑都必须在客户端上,那么您需要做出决定。要么a)不要打扰b)打击你的头,试图构建完美的安全小环境(这将失败)或c)依赖与用户的法律协议。

TL; DNR:我的意见?为你的工作感到自豪,让它的价值独立存在。保持服务器端的私有业务逻辑和适当的架构,除了放弃人们看到您的客户端代码将威胁您的业务的概念,这是一种简单而合理的方法。另外,缩小你的JS。它不能保护您的知识产权,但它还有其他更实际的好处。

答案 1 :(得分:0)

这是我的建议:

  1. 您需要使用.NET Forms身份验证。这将允许你
  2. 要像这样设置web.config:
  3. <compilation ...> 
           <buildProviders>
            <add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
            <add extension=".htm" type="System.Web.Compilation.PageBuildProvider"/>
            <add extension=".js" type="System.Web.Compilation.PageBuildProvider"/>
          </buildProviders>
        </ compilation ...>
    

    此配置会强制您的html和js针对您的表单身份验证进行验证,而不会丢失MVVM Javascript Framework的奇迹。

    1. 设置角色和权限可能基于文件夹,再次在您的web.config中保护html和js文件,如下所示:
    2. <location path="js/app/folder1">
          <system.web>
            <authorization>
              <deny users="?"/>
              <allow roles="role1"/>
            </authorization>
          </system.web>
        </location>
       <location path="js/app/folder2">
          <system.web>
            <authorization>
              <deny users="?"/>
              <allow roles="role2"/>
            </authorization>
          </system.web>
        </location>
        </location>