2013-04-04 40 views
17

最近、ノード/エクスプレスサーバでHTTPSを設定する際にスタブを取った。次のコードを使用してhttpsを使用するすべてのルートをリダイレクトできました。すべてのルートのHTTPSリダイレクトnode.js/express - セキュリティの問題

// force https redirect 
var https_redirect = function(req, res, next) { 
    if (req.secure) { 
    if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
    } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
    } 
    } else { 
    return next(); 
    } 
}; 

app.get('*', function(req, res, next) { 
    https_redirect(req, res, next); 
}); 

これはうまくいきます。

  1. これは、HTTPからHTTPSにリダイレクトするための理想的な方法です:私はhaventは以来、私は質問のカップルを持って前にしかし、」これに手を出して?
  2. ユーザーがhttpルートを使用している場合、リダイレクトする前に誰でもsslstripのようなものを使用してセッション情報を傍受できます。

node:v0.8.2;表現:

// force https redirect 
var https_redirect = function() { 
    return function(req, res, next) { 
    if (req.secure) { 
     if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
app.use(https_redirect()); 

app.get('/', routeHandlerHome); 

答えて

42
function requireHTTPS(req, res, next) { 
    if (!req.secure) { 
     //FYI this should work for local development as well 
     return res.redirect('https://' + req.get('host') + req.url); 
    } 
    next(); 
} 

app.use(requireHTTPS); 
app.get('/', routeHandlerHome); 

ミドルウェアアプローチを明示するので動作します:自動的に安全な要求のすべてをリダイレクトするようあなたは、単に(ビットが変更されても)自分のhttps_redirect機能を使用することができv3.05

+0

応答のためにPeterに感謝します。これは本当に助けになりました。 – los7world

+2

これは素晴らしいですが、非標準(HTTPの場合は80、HTTPSの場合は443)を使用している場合は、 'https:// localhost:[PORT]'にリダイレクトしようとするため、少し問題になります。回避策は 'development'環境で' SSL_PORT'環境変数を設定し、それが定義されている場合はポートを置き換えます。修正されたスニペットについては、[here](https://gist.github.com/gingi/47df42a45bb1653002ee#file-gistfile1-js-L5-L8)を参照してください。 – Gingi

+0

hei、これを行った後にフロントエンドクライアントに接続するにはどうすればよいですか?ありがとう! – alexsc

1

をルータを実行する前にミドルウェアを追加した順序で実行します。一般的に、このようなサイト全体のポリシーは、ミドルウェアとワイルドカードのルートとしてよりクリーンです。

質問2については、セッションCookieを盗聴するには、設定したときにCookieにsecureとマークする必要があります。彼らが安全とマークされていない場合、ブラウザはHTTP要求と共にそれらを送信し、それによりそれらをスニッフィングにさらします。

+0

Hey Josh。返信いただきありがとうございます。あなたは、具体的にどのようにあなたのアプローチをアプリで強調表示できますか?私の実装と比較して使用することができます。 – los7world

+0

@ los7world:app.use()を使用すると、特にルートマッチングのないミドルウェアを設定しているため、すべてのルートが通過します。 – red

+0

。あなたのご意見ありがとうございます。 – los7world

0

この単純なコードを使用して、アプリケーションが開発中か運用中かによって要求をリダイレクトします。

// force https redirect 
var forceHTTPS = function() { 
    return function(req, res, next) { 
    if (!req.secure) { 
     if (app.get('env') === 'development') { 
     return res.redirect('https://localhost:3001' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
関連する問題