ベストプラクティス:ノードJSセキュリティ


プログラマとして、我々のWebアプリケーションが安全であることを保証しなければなりません.
この短いポストでは、あなたのWebアプリを確保するためのいくつかの方法を通過します.
任意の欠陥は、データ、努力、あるいはプログラム自体の損失をもたらすことができます.私の焦点はノードのJSですが、この原則はあまりにも他の言語に適用されます.


🥦 APIの秘密を共有する必要はありません.
フロントエンドに送信しているデータを公開しないでください.

以上の応答をuser successfully createdに置き換えることができる.

🥦 使用する
ヘルメットは、さまざまなHTTPヘッダーを設定することにより、あなたのエクスプレスアプリを確保することができます.それは銀の弾丸ではありませんが、それは助けることができます.source
const helmet = require('helmet')
app.use(helmet())
🎯 あなたがヘルメットを使わなかったなら、あなたのヘッダーはこのように見えます.

🎯 ヘルメットで👇🏿

コードのこれらの2行は、お客様のウェブサイト上の機密データの保護を支援することができます.

🥦 推奨されない、または脆弱なバージョンのExpressは使用しないでください.
より頻繁に推奨されない警告を取得します.
あなたのパッケージが最新であることを確認するか、最新のリリースに移行します.
app.use(bodyParser()); //Now deprecated

🥦 環境変数
私が最初にウェブ開発を学び始めたとき、私が受けた最初の厳しい警告のうちの1つは上級開発者から来ました.
「安全な場所であなたのAPIキーと他の情報を保存してください.


🥦 速度制限器
あなたのアプリケーションを安全に保つために.
あなたは、ブルートフォースの攻撃の制限速度のいくつかの並べ替えを構築する必要があります.
ノードのレート制限パッケージ.JSを使用できます.
NPMインストールエクスプレス料金制限
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests per windowMs
});

//  apply to all requests
app.use(limiter);
source

🥦 パスワードはプレーンテキストに保存してはいけません.
プレーンパスワードのハッシュパスワードへの変換を支援するライブラリがあります.bycryptはそのようなライブラリの一つです.
const bcrypt = require('bcrypt');
const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';
const someOtherPlaintextPassword = 'not_bacon';
それはあなたが最も最近のライブラリを利用することが重要です.

< kbd > bcryptとbcryptjsの違いを考えてください.私は、活発に維持されるライブラリを使いたいです.

クライアントに共有される情報量を制限する
例えば、以下のコードでは、ユーザ{パスワード:0 }に返されたデータから削除されます.
router.get('/me', VerifyToken, function(req, res, next) {

    User.findById(req.userId, { password: 0 }, function(err, user) { //{password: 0 is called projection i.e hide certain infos from the fetched data}
        if (err) return res.status(500).send("There was a problem finding the user.");
        if (!user) return res.status(404).send("No user found.");
        res.status(200).send(user);
    });

});
つのセキュリティ意識のステートメント:ユーザーに“ユーザーが見つかりません”メッセージを送信する必要があります(またはそれらのパスワードが正しくないことを伝える).
これはアカウント列挙型脆弱性アカウント列挙型脆弱性として知られています.
これは誰かがあなたのシステムに存在するかどうかを発見できるようになります.そして、スパムリスト、フィッシング、および他の目的のために情報を利用できるようにします.
提供される資格情報が間違っていたか、またはそのような何かであると単に述べるのが好ましいです.

結論
これはちょうどあなたのWebアプリにセキュリティを追加するための基本的なガイドです.
サーバーを確保するための追加オプションを見てください.

議論する
どのような他の手順や戦略を使用してあなたのオンラインアプリケーションを確保するために使用ですか?

リファレンス
Best Practice-Security
読書ありがとう