スタイル・エッジ技術ブログ

士業集客支援/コンサルティングのスタイル・エッジのエンジニアによるブログです。

フォーム作成時に気をつけること(セキュリティ編)

f:id:styleedge_tech:20190708200332p:plain

初めまして!スタイル・エッジ システム事業部のMです。 業務ではPHPでの実装をはじめ、システム設計やチームマネジメントなど色々と経験を積んできています。 また、セキュリティ顧問になるべくセキュアコーディング面での技術向上と後輩エンジニアへの指導も行なっています。

今回はみなさん一度は作成したことのあるフォーム画面について、 少し似ている二つの攻撃とその対策についてお話しできればと思います。

今回扱うテーマ

XSS
  • 概要 XSSはwebページ内で不正なスクリプト(処理)を実行される攻撃です。

例えば、この攻撃に対する脆弱性があるサイトの <script>alert('あなたの個人情報を取得しました。')</script> をURLに含むリンクをクリックすると上記メッセージがポップアップで表示されます。
この場合は利用者に実害はないですが、それでも利用者を不安がらせ、サイト運営者への信頼を損なうことになります。 接続情報を取得するようなスクリプトであれば、第三者による不正アクセスも可能になってしまうため特に注意が必要です。

  • 対策
    対策としては以下が挙げられます。
    • フォームの値を画面に出力する際はhtmlspecialchars()などで特殊文字をエンティティに変換する
      →画面上にはただの文字列として表示されるので、不正なスクリプトが実行されなくなります。
    • CookieにHttpOnly属性を付与する
      JavaScript経由でCookieの値を取得できないようにします。
CSRF
  • 概要 CSRFはwebページ内の特定の機能を意図せず実行させられる攻撃です。
    SNS掲示板に犯行予告の書き込みを行なってしまうなど、かつて大きな話題になりました。
    この攻撃に対する脆弱性があるサイトにログインした状態のまま「『〇〇で△△する』と投稿する」URLのリンクをクリックした場合、
    ログインしているユーザとしてその内容を投稿してしまいます。
    つまり、攻撃者は他人の正規アカウントを利用して投稿を行うことができるのです。
    身に覚えのないうちに犯罪予告をしてしまうなど、この攻撃により利用者が大きな被害を被る可能性があるので 運営者としては防いでおくべき攻撃の一つです。

  • 対策
    対策としては以下が挙げられます。

    • フォーム画面にトークンをセットし、正しい流れで送信が行われていることを確認する。
      →現在よく使われている手法です。弊社の開発標準になっているLaravelでもこの機能が実装されています。
    • CookieにSameSite属性の'Strict'または'Lax'を設定する
      →Strictでは他のドメインからのリクエストからCookieが自動で付与されないことで、ログインが必要なサイトであればログイン画面が必要になります。
      また、LaxでもPOSTメソッドの場合はCookieを送らないようにします。
まとめ

今回挙げた内容は数多くある攻撃・対策のほんの一部です。 この他にもSQLインジェクションやメールヘッダインジェクションなど、 フォームに関連するセキュリティ対策だけでも様々ありますので、 気になった方はぜひ調べてみてください!

最後に

スタイル・エッジ システム事業部では、一緒に働く仲間を募集しています。 もし興味を持っていただけましたら、ぜひ採用サイトものぞいてみてください!

株式会社スタイル・エッジLABO採用サイト