2012-02-06 90 views
4

我想为我的web应用程序使用内容网站保护。如果您还没有听说过它,简而言之:它将允许我禁用任何嵌入式JavaScript到我的Web应用程序中,从而帮助阻止XSS。Javascript和CSP - 最佳实践

结果是,我所有的javascript代码都必须在外部文件中。

大多数JavaScript'库/框架'代码已经存在,但通常我的页面至少包含几行JS代码,实例化与特定页面相关的组件。

例如,我有一个假设的注册页面。在注册页面的底部,我有以下代码:

var registrationForm = new MyApp.registrationValidator($('.regform')); 
registrationForm.init(); 

这个假设代码获取登记表格的引用,可以注册所有的验证代码。

现在我必须将此代码移动到外部文件。我可以:

选项A:为每个页面创建一个小的.js文件,该文件只执行该页面特定的代码。

  • 优点 - 简单较快
  • 缺点 - 每一页这一个额外的js文件,我更喜欢能够为我所有的JavaScript减少到一个单一的文件,以减少请求。

选项B:在JavaScript文件中执行我所有的'实例化代码'。我只会检测页面上是否有'.regForm'css类,并且只有在页面上出现对象时才会实例化对象。

  • 优点 - 用于实例化的单个位置。如果页面上的组件具有正确的css类,它将奇迹般地开始工作。
  • 缺点 - 如果我的应用程序增长很多,将会有很多初始化代码可能不需要用于特定页面。

选项C:给我<body>标签的ID或类,并执行基于一个大的交换机上的正确的代码。

  • 优点:仍然可以压缩为一个.js文件,而且我不需要每页.js文件。
  • 缺点:我想我觉得这有点难看。

总之,选项B是最好的,如果它不是因为我觉得有一大堆初始化代码是个坏主意。

我主要想知道的是,你有这种情况的经历,你是如何解决它的?

回答

3

选项D(A和B的变体):查看将多个javascript源文件编译(并缩小)为一个的部署系统,仅考虑该页面所需的文件。

对于PHP,Assetic就是这样一个系统。

+0

谢谢!这是一个很好的建议,也是一个很好的解决问题的项目。尽管我觉得我最终能够给用户一个大的js包,而不是为大多数页面提供新的下载。 – Evert 2012-02-07 11:04:21

1

如果你愿意使用像jQuery这样的框架(动态加载和执行外部javascript),你可以将A和B的优点结合起来。每个页面都会加载相同的.js,它决定(通过存在或不存在dom元素)动态加载哪些其他.js文件。

+0

我们使用jQuery以及主干。我试图在选项B中暗示这一点,但是感谢你做了一个更好的工作来描述我的意思:) – Evert 2012-02-06 12:47:37

+0

如果你想摆脱客户端的初始化代码,你可以让php/asp/jsp确定哪个.js附加到html输出。对于PHP我确信,你可以做DOM XML遍历。 – maddrag0n 2012-02-06 12:52:23