見出し画像

Webサイトの脆弱性対策について

こんにちは!新卒入社3年目でエンジニアをしているものです。

今回はWebサイトの安全な稼働に必要不可欠なセキュリティ対策について、3つをピックアップしてご紹介いたします。
普段見ているWebサイトも色々対策しているんだな~という視点で見ていただけると幸いです。


①クロスサイトスクリプティング

1つ目はクロスサイトスクリプティングの対策です。
これは動的ページに対して悪意のあるスクリプトをリクエストパラメータに埋め込み、個人情報やCookieなどを盗み取る攻撃です。その攻撃を防ぐには、文字列をスクリプトとして認識させない「URLエンコード」が有効です。
VB.NETでは「System.Web.HttpUtility.UrlEncode()」で文字列をURLエンコードできます。以下が例です。

Dim str As String = "Hello, World!"
Dim urlEncode As String = System.Web.HttpUtility.UrlEncode(str)
Console.WriteLine(urlEncode)

出力:Hello%2c+World%21

これによりスクリプトが埋め込まれても、他の文字列に変換されて不正なクエリが実行されなくなります。

②HSTS(HTTP Strict Transport Security)

2つ目はHTTPSへのアクセスを強制して情報漏洩を予防する、HTTP Strict Transport Securityです。

Webセキュリティのプロトコルで、Webサイトのセキュリティを向上させるために使用されます。
設定方法はこちらです。

Header set Strict-Transport-Security "max-age=31536000;"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains;"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

max-age:単位は「秒」で、ブラウザに設定を記憶させる期間。(31536000は1年)
includeSubDomains:すべてのサブドメインにも、HSTSのルールを同様に適用する設定。省略可能。
preload:プリロードHSTS(Preload HSTS)といい、1回目のアクセスからHTTPSを強制する設定。省略可能。

HSTSはMITM(Man-in-the-Middle)のような攻撃によるデータの盗聴、改ざんを防いでいます。以下、利点と仕組みです。

▼利点
1. クライアントがWebサイトにアクセスする際に常にHTTPSを使用するため、通信の暗号化が保証され、セキュリティ上の脅威が軽減される。
2. ユーザーが意図せずにHTTP経由でウェブサイトにアクセスすることを防ぎ、セッションハイジャックやクッキーの盗難などの攻撃から保護される。
3. HSTSポリシーは一度設定されると、クライアントのブラウザにキャッシュされ、一定の期間(通常は数ヶ月)にわたって有効となる。

▼仕組み
1. クライアントがHSTS対応のウェブサイトに初めてアクセスすると、WebサーバーはレスポンスヘッダーにHSTSポリシーを含めて返します。

Strict-Transport-Security: max-age=<expire-time>

2. クライアントはHSTSポリシーを受け取ると、Webサイトへの将来の接続においてHTTPSを使用するように自動的に設定されます。
3. 2回目のアクセス以降、クライアントが同じウェブサイトにアクセスする場合、常にHTTPSを使用して接続を試みます。
※Webサイト自体がSSL化されていない場合でもHTTPSアクセスが強制されてしまうので注意が必要です。

このようにmax-ageやpreloadを任意で決められるので、それぞれでセキュリティを担保できるように設定を加えたほうが良さそうですね。

③Cache-Control

最後はCache-Controlの設定についてです。
HTTPヘッダーフィールドの1つであり、キャッシュの動作を制御するために使用されます。一般的な種類を6つご紹介します。

1. public: レスポンスが公開キャッシュにキャッシュ可能であることを示します。公開キャッシュは、複数のユーザーまたはクライアント間で共有されるキャッシュです。
2. private: レスポンスが特定のユーザーに対してのみキャッシュ可能であることを示します。プライベートキャッシュは、特定のユーザーまたはクライアントによって所有および管理されるキャッシュです。
3. no-cache: レスポンスをキャッシュする前に、常にオリジンサーバーとの検証を行う必要があることを示します。キャッシュはデータを保持している可能性がありますが、毎回オリジンサーバーに確認する必要があります。
4. no-store: レスポンスをキャッシュに格納しないように指示します。キャッシュはレスポンスを一切保持せず、毎回オリジンサーバーからリソースを要求します。
5. max-age: キャッシュが有効な期間(秒単位)を指定します。例えば、max-age=3600は、レスポンスが受信されてから1時間はキャッシュが有効であることを示します。
6. s-maxage: 公開キャッシュに対してのみ適用される、キャッシュの有効期間を指定します。max-ageとは異なり、s-maxageは共有キャッシュ(プロキシサーバーなど)にのみ適用されます。

一挙に記載しましたが、とにかく種類が多く様々な組み合わせが可能です。
実際に設定を見ることができるのはGoogle ChromeのNetWorkタブで、Headersにあります。

Cache-Control: private, no-cache, no-store, must-revalidate

これらの指示を組み合わせてHTTPキャッシュの動作を柔軟に制御することができるので、ユーザに対してどこまでキャッシュを効かせるか、何分キャッシュを有効にするかなどをカスタマイズできるのが利点ですね。

まとめ

今回は脆弱性対策を3つピックアップしてご紹介しました。
この記事を書いていて、「読むだけ」と「文字に起こす」ことの理解度の違いを感じました。文字に起こすには説明するだけの理解度が必要で、少し読んだだけとは違うなと思ったので普段からアウトプットの意識を付けようと思います。
また調べていて、この他にもたくさんの攻撃やそれに対する対策があるとこを実感したので、日々セキュリティの意識もアップデートしていきたいです。

この記事が気に入ったらサポートをしてみませんか?