NodeJS 拒绝设置不安全的头

NodeJS 拒绝设置不安全的头

想要发送一个 GET 请求,利用

request.setRequestHeader("Referer","https://www.github.com");

来设置 Referer 的值,结果 node 之后请求失败,报错

Refused to set unsafe header "Referer"

说是浏览器不允许用户手动设置敏感的 Http header,比如 cookie、host、referer 之类的


利用 PhantomJS 可通过令 web-security=no 来设置此类敏感 header 并成功发送请求,不知道 NodeJS 中有没有可能进行类似的设置。

由于我在尝试用 node-webkit 写一个带图形界面的程序,所以不打算使用 PhantomJS,必须让 js 能在 NodeJS 下运行成功才行。

所以求问各位 V 友,在 NodeJS 中有没有设置敏感 header 的方法?


11 回复

nodejs 好像不管这个…



nodejs 不管 http,只管 https 的 url
phantomjs 两者都可以绕过

我把 http://httpbin 改成 https://httpbin 仍然可以运行

你的 request 应该是一个 XMLHttpRequest 对象吧…nodejs 是不提供这个的,只提供 http 标准库…

原来如此,那我放弃 XHR 了,还是按 http 标准库来操作。多谢!

对那些 unsafe header 的限制是浏览器做的,nodejs 和浏览器是不同的运行环境,nodejs 没有这些限制。

楼上+1 和 nodejs 无关,是浏览器限制的,同求解决方案

你用了 node-webkit 的浏览器 API 会受限制

碰到限制就用 node 的 API 就好了嘛

请问图中利用 request module 的 get 请求是同步的还是异步的?

异步的。。倒数三行是个回调函数

在Node.js中,设置不安全的HTTP头(例如Set-Cookie没有SecureHttpOnly属性,或者允许不安全的HTTP方法如TRACETRACK)可能会引发严重的安全风险。为了避免这些风险,你可以采取以下几种措施:

  1. 确保Set-Cookie头包含SecureHttpOnly属性

    使用expresscookie-parser中间件时,可以这样设置:

    const express = require('express');
    const cookieParser = require('cookie-parser');
    const app = express();
    
    app.use(cookieParser());
    
    app.get('/', (req, res) => {
        res.cookie('myCookie', 'myValue', { secure: true, httpOnly: true });
        res.send('Cookie is set');
    });
    
    app.listen(3000, () => console.log('Server running on port 3000'));
    

    注意:secure: true要求通过HTTPS传输。

  2. 禁用不安全的HTTP方法

    你可以使用express的中间件来禁用TRACETRACK方法:

    const express = require('express');
    const app = express();
    
    app.disable('x-powered-by');
    
    const methodsToDisable = ['TRACE', 'TRACK'];
    methodsToDisable.forEach(method => {
        app.METHOD(method, (req, res, next) => {
            res.status(405).send(`Method ${method} Not Allowed`);
        });
    });
    
    app.listen(3000, () => console.log('Server running on port 3000'));
    

    注意:METHOD是占位符,需要替换为实际的HTTP方法名。

通过这些措施,你可以有效减少Node.js应用中的安全风险。

回到顶部