reactjsを使用してjStorageをlocalStorageに保存しても安全ですか?


147

現在、reactjsを使用して単一ページアプリケーションを構築しています。localStorageを使用しない理由の多くはXSSの脆弱性によるものだと私は読んだ。Reactはすべてのユーザー入力をエスケープするので、localStorageを使用しても安全ですか?


4
セッションストレージを好む
Praneet Rohida


3
「機密情報をローカルストレージに保存しないことをお勧めします。」-OWASP "永続化せずにメモリに保存する" -Auth0
avejidah

私はAuth0がこれについての見方を変えたかもしれないと思います-提供されたリンクに上記の引用が見つからないためです
DauleDK

回答:


141

最近のほとんどの単一ページアプリケーションでは、実際にトークンをクライアント側のどこかに保存する必要があります(最も一般的な使用例-ページの更新後もユーザーをログイン状態に保つため)。

利用可能なオプションは、Webストレージ(セッションストレージ、ローカルストレージ)とクライアント側Cookieの合計2つです。両方のオプションが広く使用されていますが、これはそれらが非常に安全であることを意味しません。

Tom AbbottはJWT sessionStorageおよびlocalStorageセキュリティをうまくまとめています

Webストレージ(localStorage / sessionStorage)は、同じドメインのJavaScriptを介してアクセスできます。つまり、サイトで実行されているすべてのJavaScriptがWebストレージにアクセスできるため、クロスサイトスクリプティング(XSS)攻撃に対して脆弱になる可能性があります。簡単に言うと、XSSは一種の脆弱性であり、攻撃者がページで実行するJavaScriptを挿入する可能性があります。基本的なXSS攻撃は、フォーム入力を介してJavaScriptを挿入しようとします。攻撃者はフォームに入力<script>alert('You are Hacked');</script>して、ブラウザによって実行され、他のユーザーが表示できるかどうかを確認します。

XSSを防ぐための一般的な応答は、すべての信頼できないデータをエスケープしてエンコードすることです。React(たいてい)はあなたのためにそれをします!ここでは、ReactがXSS脆弱性保護のどれほどの責任を負うかについての素晴らしい議論を示します。

ただし、すべての脆弱性を網羅しているわけではありません。もう1つの潜在的な脅威は、CDNまたは外部インフラストラクチャでホストされているJavaScriptの使用です

これがトムです。

最新のウェブアプリには、A / Bテスト、目標到達プロセス/市場分析、広告用のサードパーティJavaScriptライブラリが含まれています。Bowerなどのパッケージマネージャーを使用して、他の人のコードをアプリにインポートします。

使用しているスクリプトの1つだけが侵害された場合はどうなりますか?悪意のあるJavaScriptがページに埋め込まれる可能性があり、Webストレージが危険にさらされます。これらのタイプのXSS攻撃は、知らないうちにサイトにアクセスする全員のWebストレージを取得する可能性があります。これがおそらく、多くの組織が価値のあるものを保存したり、Webストレージに情報を信頼したりしないことを勧める理由です。これには、セッション識別子とトークンが含まれます。

したがって、私の結論は、ストレージメカニズムとして、Web Storage は転送中に安全な標準を適用しないということです。Web Storageを読んでそれを使用するユーザーは、JWTを常にHTTPS経由で送信し、HTTP経由では送信しないようにするために十分な注意を払う必要があります。


10
だから私があなたを正しく理解しているなら、あなたはクッキーを勧めますか?念のため。ありがとう!
SuperLemon 2017

7
はい。Cookieが提供する追加のセキュリティと、最新のWebフレームワークによるCSRFからの保護の単純さのため、Cookieをお勧めします。Webストレージ(localStorage / sessionStorage)はXSSに対して脆弱であり、攻撃対象領域が大きく、すべてのアプリケーションユーザーが攻撃に影響を与える可能性があります。
Kaloyan Kosev 2017

48
これらは混同していると思いますか?最新のWebフレームワークには、XSS用の強力な防御機能が組み込まれています。しかし、xsrfではそれほどではありません。xsrfの最善の防御策は、Cookieを完全に使用しないことです。ローカルストレージは特定のドメインにサンドボックス化されています。つまり、攻撃者のドメインはそれにアクセスできません。Webフレームワークは、ユーザー入力を自動的にエンコードおよびサナタイズすることにより、xssを防ぎます。angular.io/guide/securityを
mikejones1477

47
「代わりにCookieをお勧めします」という場合、答えのどこかにそれをお勧めできますか?コメントだけでなく?
2018年

7
私はここに少し遅れて、今これらのトピックを読んでいるだけで、1つのことについて混乱しています。多くの人が、あなたがXssで妥協している場合、httpのみのCookieで保護されていると話しますが、xssがある場合攻撃者はあなたを盗む必要はありません。ページから簡単に投稿して、そのCookieを使用して偽装することができます(盗むことができない場合でも)。私は何かを逃していますか?
Borja Alvarez

35

これは古い質問ですが、@ mikejones1477によると、最新のフロントエンドライブラリとフレームワークはテキストをエスケープしてXSSから保護しています。cookieが資格情報を使用した安全な方法ではない理由は、localStorageが行うときにcookieがCSRFを妨げないためです(cookiesはjavascriptからもアクセスできるため、XSSはここでは大きな問題ではないことを忘れないでください)。この回答が理由を再開します。

認証トークンをローカルストレージに格納し、それを各リクエストに手動で追加することがCSRFから保護される理由は、そのキーワードである手動です。ブラウザはその認証トークンを自動的に送信しないため、evil.comにアクセスしてPOST http://example.com/delete-my-accountを送信できた場合、認証トークンを送信できません。要求は無視されます。

もちろんhttpOnlyは聖杯ですが、reactivejsやjsフレームワークからはアクセスできません。私の推奨はlocalstorageです。または、cookieを使用したい場合は、djangoのようにCSRFの問題に何らかの解決策を実装するようにしてください。

CDNに関しては、たとえばgoogleやbootstrapの提供のようなCDNなどの奇妙なCDNを使用していないことを確認し、コミュニティによって管理され、悪意のあるコードが含まれていないことを確認してください。わからない場合は、自由に確認できます。


2
Cookieを使用しているときにCSRFに対して依然として脆弱であると言う理由がわかりません。フラグHttpOnly SameSite=strictsecureでCookieを使用すると、Cookieに設定した情報が安全に保たれます。次に、XSSに対して、JavaScriptがトークンやパスワードなどの認証関連データを認識しないことを確認するだけです(つまり、Webストレージに保存しないでください)。悪意のあるスクリプトをインポートすると、そのスクリプトはアクセスできなくなります。機密データに。はい、JSを介してトークンにアクセスすることもできませんが、実際には問題ありません。
13:22のミフェ

@mipheそれは私が言ったことです。しかし、OPはjavascriptからアクセスする方法を求めています。ここでは、jsからアクセス可能なトークンを保存するための最良の方法を説明しています。
Mauricio Cortazar

21

基本的に、JWTをlocalStorageに保存しても問題ありません。

これは良い方法だと思います。XSSについて話している場合、CDNを使用するXSSは、クライアントのログイン/パスも取得する潜在的なリスクでもあります。ローカルストレージにデータを保存すると、少なくともCSRF攻撃を防ぐことができます。

両方を認識し、必要なものを選択する必要があります。両方の攻撃は、注意する必要があるすべてのものではありません。覚えておいてください。アプリ全体は、アプリの最も安全なポイントと同じくらい安全です。

もう一度保存しても問題ありませんが、XSS、CSRFなどの脆弱性はありません


2
これが、次のことを行うことが安全な理由です。-XSSから取得できないようにCookieにJWTを保存します-CSRFから取得できないようにlocalStorageにCSRFトークンを保存します
Alejandro Cavazos

33
あなたは良い点を持ち出します:あなたのサイトが悪意のあるスクリプトを実行するならば、それはとにかくゲームオーバーです。キーダウンイベントをパスワードタイプの入力にバインドし、その方法でユーザーの認証情報を盗むことができます(JWT認証トークンを盗むよりもはるかに悪い)。JWTをlocalStorageに格納しても、XSSによるすでに計り知れない被害が増えることはほとんどありません。
カール・Leth

8

CDNを使用する場合は安全ではありません。

悪意のあるJavaScriptがページに埋め込まれる可能性があり、Webストレージが危険にさらされます。これらのタイプのXSS攻撃は、知らないうちにサイトにアクセスする全員のWebストレージを取得する可能性があります。これがおそらく、多くの組織が価値のあるものを保存したり、Webストレージに情報を信頼したりしないことを勧める理由です。これには、セッション識別子とトークンが含まれます。

ストームパス経由

外部から必要なスクリプトはすべて侵害される可能性があり、クライアントのストレージからJWTSを取得し、個人データを攻撃者のサーバーに送り返す可能性があります。


6
CDNを使用する予定がない場合、それは安全ですか?

1
この記事の著者は、CDNを介して、または中央サーバーから直接提供されるサイトのXSSを区別していません。ここでの説明は、CDNだけでなく、一般的にも当てはまりますか?
Vlad

5

LocalstorageはJavaScriptからアクセスできるように設計されているため、XSS保護は提供されません。他の回答で述べたように、XSS攻撃を実行する方法はたくさんありますが、デフォルトではlocalstorageが保護されていません。

ただし、Cookieには、XSSおよびCSRF攻撃から保護するセキュリティフラグがあります。HttpOnlyフラグは、クライアント側のJavaScriptがCookieにアクセスできないようにします。Secureフラグは、ブラウザーがsslを介してCookieを転送することのみを許可し、SameSiteフラグは、Cookieが確実にオリジンに送信されるようにします。チェックしたところ、SameSiteは現在OperaとChromeでのみサポートされているため、CSRFから保護するには、他の戦略を使用することをお勧めします。たとえば、暗号化されたトークンをいくつかのパブリックユーザーデータと共に別のCookieで送信します。

したがって、Cookieは認証データを格納するためのより安全な選択肢です。


取得できません:HttpOnlyはどのようにしてCSRFからユーザーを保護できますか?
Alex Lyalka 2017年

@AlexLyalkaすべてのCookieフラグを一緒にXSSおよびCSRFから保護できるのではなく、HttpOnlyがCSRFを防止すると言っているわけではありません。SameSiteは保護を提供し、Cookieが発信元とは異なるサイトに送信されるのを防ぎます。私はチェックしたばかりですが、そのフラグのサポートは非​​常に低くなっています。また、サーバーでチェックされるユーザーIDを含む個別の暗号化されたトークンでCSRFを回避することもできます。
Ivan

1
まあ、誰かがあなたのウェブでコードを実行できるなら、彼は単にあなたのユーザーの名前であなたのウェブにあなたのウェブに投稿をすることはできませんか?わかりました、彼はあなたのhttpのみのcookieを取得できませんが、それらのcookieを使用して電話をかけることができるので、私はまだ要点を理解できません
Borja Alvarez

2
@BorjaAlverez大きな違いがあります。はい、XSSを介して誰かがログインしたユーザーに代わってリクエストを行う可能性がありますが、トークンを危険にさらすことはさらに悪いことです。例:トークンは、クライアントアプリケーションが使用しないAPIへのアクセスを提供する場合があります。トークンには、ユーザーに関するその他の情報(メールアドレス、プロファイル、許可)が含まれる場合があります。トークンは、アプリケーションに対するリプレイ攻撃で使用される可能性があります。トークンをid_token_hintOIDC認証サーバーに渡すことができます。トークンは、署名に使用された暗号に関する攻撃者情報を提供します。など
avejidah

3

これを調べる方法は、リスクまたは危害のレベルを検討することです。

ユーザーなしのアプリ、POC / MVPを構築していますか?市場に出て、アプリをすばやくテストする必要がある新興企業ですか?もしそうなら、私はおそらく最も単純なソリューションを実装し、製品と市場の適合性を見つけることに焦点を当て続けるでしょう。多くの場合、実装が簡単なlocalStorageを使用します。

日常のアクティブユーザーが多いアプリのv2を構築していますか、それとも、人や企業が大きく依存しているアプリですか。ハッキングされたということは、回復の余地がほとんどないか、まったくないということですか?もしそうなら、私はあなたの依存関係を長く見て、http専用のcookieにトークン情報を保存することを検討します。

localStorageとcookie / sessionストレージの両方を使用することには、それぞれ長所と短所があります。

最初の回答で述べたように、アプリケーションにXSSの脆弱性がある場合、どちらもユーザーを保護しません。最近のほとんどのアプリケーションには12以上の異なる依存関係があるため、アプリケーションの依存関係の1つにXSSの脆弱性がないことを保証することがますます困難になります。

アプリケーションにXSSの脆弱性があり、ハッカーがそれを悪用できる場合、ハッカーはユーザーに代わってアクションを実行できます。ハッカーはlocalStorageからトークンを取得してGET / POSTリクエストを実行したり、トークンがhttp専用のcookieに保存されている場合はPOSTリクエストを実行したりできます。

トークンをローカルストレージに保存することの唯一の欠点は、ハッカーがトークンを読み取ることができることです。


1

localStorageもhttpOnly Cookieも受け入れられませんか?侵害されたサードパーティのライブラリに関して、機密情報の盗難を削減または防止することがわかっている唯一のソリューションは、サブリソースの整合性を強化することです。

サブリソース整合性(SRI)は、ブラウザーがフェッチするリソース(CDNなどから)が予期しない操作なしで配信されていることをブラウザーが確認できるようにするセキュリティ機能です。これは、フェッチしたリソースが一致しなければならない暗号化ハッシュを提供できるようにすることで機能します。

侵害されたサードパーティのライブラリがWebサイトでアクティブである限り、キーロガーはユーザー名、パスワードなど、サイトに入力したその他の情報の収集を開始できます。

httpOnly Cookieは別のコンピューターからのアクセスを防ぎますが、ハッカーがユーザーのコンピューターを操作するのを防ぐことはできません。


-10

トークンを暗号化する限り、トークンをlocalStorageに保存しても安全です。以下は、多くの方法の1つを示す圧縮コードスニペットです。

    import SimpleCrypto from 'simple-crypto-js';

    const saveToken = (token = '') => {
          const encryptInit = new SimpleCrypto('PRIVATE_KEY_STORED_IN_ENV_FILE');
          const encryptedToken = encryptInit.encrypt(token);

          localStorage.setItem('token', encryptedToken);
     }

次に、トークンを使用する前に、 PRIVATE_KEY_STORED_IN_ENV_FILE


@HassanAlthafあなたはここで要点を逃しています、100%安全な証明アプリは決してありません、それはそれだけです、あなたは攻撃面を減らしており、少なくともenvファイルはgithubに直接公開されません。また、バンドルされたコードは難読化され、分解されるため、攻撃者がコードを見つけにくくなります。
キダリケビン

秘密鍵が公開されることは想定されていません。API全体が危険にさらされます。
Hassan Althaf

私の経験からインテリジェントに正しく操作した場合、秘密キーは製品ビルドで公開されません。公開されている場合、これをサポートするスクリーンショットまたはURLです。
Kidali Kevin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.