我正在使用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的包装器(据我所知)。
答案 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有关在响应对象上设置标题的更多详细信息