Javascript和CSP - 最佳实践

时间:2012-02-06 12:37:46

标签: javascript jquery content-security-policy

我想为我的网络应用程序使用内容站点保护。如果您还没有听说过,简而言之:它将允许我禁用任何嵌入式JavaScript进入我的网络应用程序,有助于防止XSS。

结果是,我的所有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是最好的,如果不是因为我觉得拥有大量初始化代码是一个坏主意。

我主要想知道的是,您是否有过这种情况的经历,以及您是如何解决的?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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