Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript和CSP-最佳实践_Javascript_Jquery_Content Security Policy - Fatal编程技术网

Javascript和CSP-最佳实践

Javascript和CSP-最佳实践,javascript,jquery,content-security-policy,Javascript,Jquery,Content Security Policy,我想对我的web应用程序使用内容站点保护。简而言之,如果您还没有听说过,它将允许我禁用web应用程序中的任何嵌入式javascript,帮助防止XSS 结果是,我的所有javascript代码都必须在外部文件中 大多数javascript“库/框架”代码已经存在,但通常我的页面将包含至少几行JS代码,实例化与特定页面相关的组件 例如,我有一个假设的注册页面。在注册页面的底部,我有以下代码: var registrationForm = new MyApp.registrationValidato

我想对我的web应用程序使用内容站点保护。简而言之,如果您还没有听说过,它将允许我禁用web应用程序中的任何嵌入式javascript,帮助防止XSS

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

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

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

var registrationForm = new MyApp.registrationValidator($('.regform'));
registrationForm.init();
此假设代码获取对注册表的引用,并可以注册所有验证代码

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

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

  • 优点-简单且相对快速
  • 缺点-这对于每个页面都是一个额外的js文件,我更希望能够将所有javascript最小化为一个文件,以减少请求
选项B:在javascript文件中执行我的所有“实例化代码”。我只会检测页面上是否有任何“.regForm”css类,并且只在对象出现在页面上时实例化它们

  • Pros-实例化的单一位置。如果页面上的组件具有正确的css类,那么它们将神奇地开始工作
  • 缺点-如果我的应用程序增长了很多,那么对于一个特定的页面,将会有很多不需要的初始化代码
选项C:给我的
标记一个id或类,并根据一个大开关执行正确的代码

  • 优点:仍然可以压缩为一个.js文件,我不需要每页都有一个.js文件
  • 缺点:我想我觉得这有点难看
总之,如果不是因为我觉得有大量的初始化代码是个坏主意的话,选项B是最好的


我主要想知道的是,您对这种情况有经验吗?您是如何解决的?

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

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


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

我们使用的是jQuery和主干。我试图在选项B中暗示这一点,但感谢您更好地描述了我的意思:)如果您想摆脱客户端的初始化代码,可以让php/asp/jsp确定要附加到html输出的.js。对于php,我确信您可以进行dom xml遍历。谢谢!这是一个很好的建议,也是一个很好的项目。虽然我觉得我希望最终能够给用户一个大的js包,而不是大多数页面的新下载。