質問: 'admin';」などと入力しただけで管理用メニューが表示されてしまいます。 また、そうでなくても表示されないにしろ、HTML/JSに管理用メニューの名前、及びAPIのアクセス先が書いてあるため、API側で何かしらの認証処理をするという前提があったとしても、管理用メニューにどういうものがあるのかを見られてしまうのは脆弱性につながりかねません。 このような点に関してどのような対処をするのが一般的なのでしょうか? [追記] 皆さん、回答ありがとうございます! 質問の仕方が悪く、自分の伝えたい本質を書くことができていませんでした。 認証周りの話というよりはユーザー(ブラウザ)がコンポーネントに対する操作が可能ということに疑問を持っています。 コンソールからコンポーネントに渡すデータを変えればそのコンポーネントの挙動を変更することとが可能だと思います。 例えば入力フォームを作る場合に特定の条件のユーザーにはフォームを表示しないといったケース、 具体的にはアンケートでユーザーの会員情報で性別が女性の場合は化粧品についてのアンケートも追加で表示させるケースを考えたいと思います。 サーバーサイドレンダリングであればサーバー側でユーザーの性別を見て生成するHTMLを変更できます。 クライアントサイドレンダリングの場合は一旦全て送り、ユーザー側で非表示にさせるといった処理が考えられそうです。 ここでユーザーがコンソールから性別データをいじった場合、男性なのに化粧品のアンケートを表示させる、女性なのに化粧品のアンケートを表示させない のようなことが可能になってしまう気がします。 回答でいただいたコードスプリッティングなどで対応はできそうですが、こんな些細なものごとにいちいち分割しているとは思えません。 [追記2] もちろんこれはSPAに限らずJavascript自体のリスクではあると思いますが、 サーバーサイドレンダリングの場合、JSは「見た目の操作」にのみ使われてることが多いと思います。 SPAではややロジックも担当している印象を受けたためこのような質問をしました。 ユーザーからの挙動変更が可能なリスクがある中でどのような策がなされているのか、あるいはなすべきなのか 教えていただきたいです。
回答: 「認証チェック、権限チェックをサーバーサイド側でするにしても、ログイン画面やらログイン後の画面やらログイン不要の一般ユーザー用画面に関するコードを1つのjsのbundleファイルにまとめてクライアントに返していたら、ログイン後のコンテンツは見れないにしても、ログイン後の画面のコードは見えてしまうよね、それってどうなの?」っていう質問であるならば、 (A)そもそも、最初から管理用画面、一般ユーザー用画面を分けて、jsファイルもそれらの画面用のものをクライアントに返す (B)Code Splittingを行って、bundleファイルの分割を行い、必要なタイミングで必要なbundleファイルを動的にクライアントに返す(Code Splitting - Dynamic imports / Webpackとか、Code Splitting / React) と、なりますかね。 小規模のアプリケーションの場合は1つのbundleファイルにコードをまとめてクライアントに返すかもしれませんが、規模が大きくなってくると、例えば、ログイン画面を表示するだけなのに、他の画面に関わるコードをまとめて送っていては、初期読み込みも遅くなってよろしくないので、Code Splittingを行なったりします。 ただ、Code Splittingはセキュリティーというよりは、パフォーマンス向上の文脈で使われることが圧倒的に多いかと思います。 > > もちろんこれはSPAに限らずJavascript自体のリスクではあると思いますが、 > > サーバーサイドレンダリングの場合、JSは「見た目の操作」にのみ使われてることが多いと思います。 > > SPAではややロジックも担当している印象を受けたためこのような質問をしました。 > > > おっしゃる通り、追記の内容からすると、もはや、spaがどうこうという話ではないと思います。 > > ここでユーザーがコンソールから性別データをいじった場合、男性なのに化粧品のアンケートを表示させる、女性なのに化粧品のアンケートを表示させない のようなことが可能になってしまう気がします。 > > > そして、セキュリティーと、もはや関係ない気がします。 > > ユーザーからの挙動変更が可能なリスクがある中でどのような策がなされているのか、あるいはなすべきなのか 教えていただきたいです。 > > > クライアント側では諦める、そして、サーバー側で対応。 SPAにかぎらず、例えば、通常のフォームであっても、フォームのUIからは選択出来ない選択肢を適当にユーザーが設定してサーバー側に送信することも可能なので、不正値かどうかはサーバー側で対応すべきものだと思います。クライアントサイドから送られてきたデータをそのままサーバーサイドで信用してはダメです。 > > 回答でいただいたコードスプリッティングなどで対応はできそうですが、こんな些細なものごとにいちいち分割しているとは思えません。 > > > そうです。そんな些細なことにコストをかける必要があるかを検討することも大事です。なので、今回の追記であったようなケースならば特に気にしないで良いかと思います。 > > サーバーサイドレンダリングであればサーバー側でユーザーの性別を見て生成するHTMLを変更できます。 > > > サーバーサイドでユーザーの性別を把握出来るということは、ユーザー登録されていることが前提ですかね。 でもその場合、ユーザー登録時に本当の性別をユーザーが登録してくれているかどうかも不明ですよね。