客户端/浏览器如何设置标准安全头? (wss连接上的https服务器)

时间:2016-05-03 21:12:40

标签: node.js security https websocket http-headers

我正在使用https://www.npmjs.com/package/hardhttps作为我的node.js应用程序。

我想将响应标头发送到客户端

  • 严格传输安全性强制实施与服务器的安全(HTTP over SSL / TLS)连接

  • X-Frame-Options 提供点击劫持保护

  • X-XSS-Protection 启用内置于最新网络浏览器中的跨站点脚本(XSS)过滤器

  • X-Content-Type-Options 阻止浏览器从声明的内容类型中嗅探响应

  • 内容安全政策可防止各种攻击,包括跨站点脚本和其他跨站点注入

https://blog.risingstack.com/node-js-security-checklist/声明我可以使用https://www.npmjs.com/package/helmet,但我没有使用express而且永远不会这样做。

https服务器用于wss websocket 。我在升级时检查某些事情以查看我是否要接受连接(作为洋葱分层安全性的一部分)

var server=(require('hardhttps').createServer({key:pem.key,cert:pem.cert,ca:[pem.ca],passphrase:pem.pass})).listen(port);
server.on("upgrade",function(req,socket,head){// happens before the websockect receives on `connection`
    var ip=req.headers['x-forwarded-for']||req.connection.remoteAddress||req.socket.remoteAddress||req.connection.socket.remoteAddress;//got their ip (can compare with previous visitor)
    });
var wss=new WebSocketServer({
    server:server
,   verifyClient:function(info,cb){
        //could verify ip here and block the connection from happening...
        if(('https://'+host)===(info.req.headers.origin)){cb(true);}
        }});
wss.on('connection',function(socket){var ip=socket._socket.remoteAddress//....

我认为以太必须在启动服务器或升级内部时设置标头,但我看不到任何这样的例子。

如果我搜索这个,我发现很多人都在谈论自定义标题,但我特意想要设置的上述标题根本不是自定义的,至少是http! websocket只是http的包装器(据我所知)。

1 个答案:

答案 0 :(得分:0)

对于node.js应用,使用任何外部框架,例如express

const http = require('http');

http.createServer((request, response) => {

    request.on('error', (err) => {
        console.error(err);

    // for this simple example I am not including the data event
    // e.g. if the request contains data in the body

    }).on('end', () => {

       response.on('error', (err) => {
           console.error(err);
       });

      // you can explicitly set your headers with setHeader or 
      // use writeHead as a "shortcut" to include the statusCode. 
      // Note writeHead won't cache results internally
      // and if used in conjuction with setHeader will take some sort of "precedence"

      response.writeHead(200, {
          "Strict-Transport-Security": "max-age=31536000"

           // other security headers here...
      });

      response.end("<html><body><h1>Hello, Security Headers!</h1></body></html>");

  });
}).listen(8080);

See the node.js documentation有关在响应对象上设置标题的更多详细信息