如何实现头盔到节点服务器?

我正在尝试第一次使用npm模块,我试图将helmet到服务器模块中来设置安全标题。 我知道helmet是为了Express但我不使用Express

我还可以在以下服务器模块中使用“头盔”吗? 如果是这样,我该怎么做(代码示例将不胜感激)? 如果没有,我可以使用什么“插件”到下面的模块,或者我应该以不同的方式攻击?

Thx为您的帮助/input。

 'use strict'; var helmet = require('helmet') , web = require('node-static') , chalk = require('chalk'); var server; module.exports = plugin; function plugin(options) { var defaults = { cache: 0 , port: 8080 , host: "localhost" , verbose: false }; var opts = options || {}; setDefaults(opts, defaults); return function(files, staticsmith, done) { if (server) { done(); return; } var docRoot = staticsmith.destination() , fileServer = new web.Server(docRoot, { cache: opts.cache}); server = require('http').createServer(function (request, response) { request.addListener('end', function () { fileServer.serve(request, response, function(err, res) { if (err) { log(chalk.red("[" + err.status + "] " + request.url), true); response.writeHead(err.status, err.headers); response.end("Not found"); } else if (opts.verbose) { log("[" + response.statusCode + "] " + request.url, true); } }); }).resume(); }).listen(opts.port, opts.host); server.on('error', function (err) { if (err.code == 'EADDRINUSE') { log(chalk.red("Address " + opts.host + ":" + opts.port + " already in use")); throw err; } }); log(chalk.green("serving " + docRoot + " at http://" + opts.host + ":" + opts.port)); done(); }; function setDefaults(opts, defaults) { Object.keys(defaults).forEach(function(key) { if (!opts[key]) { opts[key] = defaults[key]; } }); } function formatNumber(num) { return num < 10 ? "0" + num : num; } function log(message, timestamp) { var tag = chalk.blue("[staticsmith-serve]"); var date = new Date(); var tstamp = formatNumber(date.getHours()) + ":" + formatNumber(date.getMinutes()) + ":" + formatNumber(date.getSeconds()); console.log(tag + (timestamp ? " " + tstamp : "") + " " + message); } } 

最好的解决scheme是通过不使用任何种类的“中间件”来实现Security Headers策略。 这使得服务器不再依赖于另一个开发人员模块,从而使事情变得更简单,更清洁,更安全。

为此,我创build了一个security-config.json5文件,其中包含易于维护和更新的设置:

 module.exports = { security: [ { name: 'Cache-Control', value: 'public, max-age=30672000' }, { name: 'server', value: 'mySpecial-Server' }, { name: 'Strict-Transport-Security', value: 'max-age=86400' }, { name: 'X-Content-Type-Options', value: 'nosniff' }, { name: 'X-Frame-Options', value: 'DENY' }, { name: 'X-Powered-By', value: 'Awesomeness' }, { name: 'X-XSS-Protection', value: '1; mode=block' }, { name: 'Content-Security-Policy', value: "default-src 'none'; script-src 'self' https://cdnjs.cloudflare.com connect-src 'self'; img-src 'self' data:; style-src 'self' https://cdnjs.cloudflare.com; font-src 'self' https://cdnjs.cloudflare.com; manifest-src 'self'" } ] }; 

上述设置是一个很好的起点,特别要注意Content-Security-Policy键/值的引用,但是您可能需要对您的网站进行一些调整。 我也展示了如何在这里实施CDN。

现在在你的createServer()函数中,你可以循环key:value对,并用setHeader()将它们添加到你的头文件中:

 var security_default = require('./security-config.json5'); for(let i = 0; i < security_default.security.length; i++) { res.setHeader( security_default.security[i].name, security_default.security[i].value ); } 

npm上的Helmet Node模块非常好,但是它膨胀了( 需要3MB的磁盘空间 ),并且需要定期更新,而对于那些不想使用中间件的人来说,这个方法很轻(<850bytes),可插拔和可维护。