はたらクラフト

【自社サイトも要注意】現役エンジニアが公開アプリで必ずやるセキュリティ対策4選

開発・運用の仕組み化

自社のサイトやアプリのように、自分以外の人も使うシステムを公開すると、ユーザーの個人情報や入力フォームが攻撃に狙われます。

この記事では、現役エンジニアのぼくが、公開するアプリやサイトで必ずやっている4つのセキュリティ対策を解説します。

自分専用アプリでも必要な対策は、非公開のアプリでもやるべきセキュリティ対策を解説した記事をご覧ください。

動画で見たい方はこちら。

対策1:機密情報は自社で持たず、外部サービスに任せる

1つ目の対策は、機密情報を持たないことです。クレジットカード情報やパスワード、名前、住所など、流出したら困る情報の管理は外部サービスに任せます。

決済はStripeに任せれば、カード情報を自社で持たずに済む

自社でカード番号を保管する場合と、Stripeに任せて自社アプリが保管しない場合の対比

決済にStripeというサービスを使えば、自社では決済情報を持たずに、ネットでの商品販売や有料コンテンツの提供ができます。

Stripeが決済の仕組みと決済情報の管理を担うので、自社でクレジットカード番号を持つ必要がありません。Claude CodeなどのAIエージェントに、決済にはStripeを使うよう指示すれば、導入も簡単です。

Stripeは初期費用・月額料金がなく、決済ごとに3.6%の手数料がかかります。それでも、情報漏洩時の損害と比べれば格安です。

ログインは、パスワードの代わりにパスキーかSSOにする

パスワードは自社が保管して流出の恐れがあるが、パスキーやSSOなら自社は認証情報を持たず流出するものがない対比

ログインも、メールアドレスとパスワードによる登録はやめましょう。パスワードは流出する恐れがあるからです。おすすめは、パスキーかSSOです。

パスキーは、スマホやタブレット、パソコン自体の指紋認証や顔認証などを使って、本人であることを証明する仕組みです。パスキーのログインなら、メールアドレスもパスワードも自社で持つ必要はありません。

SSOはシングルサインオンの略で、特定のサービスの認証情報で複数のサービスを利用できる仕組みです。GoogleアカウントやFacebookアカウントでログインできるサイトがよくありますが、あれがSSOです。

SSOでは、ログイン情報をGoogleやFacebook側が持ち、自社では持ちません。そのため、攻撃されても流出するものがありません。

住所などの個人情報は、持つかどうかから検討する

マーケティングのためにメールアドレスくらいは必要かもしれません。しかし、それ以外の住所などの個人情報は、流出したときのリスクも考えて、自社で持つかを検討すべきです。

対策2:フォームは、4つの対策で攻撃から守る

入力フォームをアクセス制限・bot対策・入力チェック・CSPの4つの対策が守る全体像

2つ目の対策は、フォームを守ることです。入力フォームのように外部からの値を受け付ける場所は、最も狙われやすい攻撃ポイントです。

フォームのセキュリティ対策でやるべきことは、アクセス制限、bot対策、入力チェック、CSPの4つです。

アクセス制限で、同じ相手からの大量のアクセスを止める

同じIPアドレスからの大量のアクセスだけを門で止め、通常のアクセスは通すアクセス制限の仕組み

アクセス制限は、1分間に同じIPアドレスから一定の回数以上のアクセスがあったらブロックする、といった対策です。IPアドレスとは、インターネット上の住所のことです。

ほかにも、特定の国からのアクセスを遮断するなど、場所で制限することもできます。

アクセス制限をすれば、攻撃者が侵入を試みて何回もアクセスするのを防げます。大量の不正アクセスでアプリやサイトに負荷がかかり、費用がかさむことも防げます。

bot対策を付けるだけで、不正アクセスの大部分を防げる

フォームの手前のbot対策の関所でbotの大量アクセスを止め、人の訪問者だけが通過する構図

フォームで「私はロボットではありません」にチェックすると、「バイクの画像を選んでください」のようなパネル選択が出ることがあります。あれは、reCAPTCHAというツールによるbot対策です。

不正アクセスはbotというプログラムで自動かつ大量に行われるので、reCAPTCHAのようなbot対策を付けるだけで、大部分は防げます。

reCAPTCHAは月1万件の判定まで無料で、CloudflareのTurnstileは回数の制限なく無料で使えます。ユーザーの入力を受け付けるフォームには、必ず付けましょう。

入力チェックで、入力欄からデータベースへの侵入を防ぐ

入力欄に書き込まれたコードや特殊な文字が入力チェックで止まり、データベースへのSQLインジェクションを防ぐ流れ

入力チェックとは、ユーザーが入力した値に、コードや特殊な文字などが入っていないかを検証することです。

検証が必要なのは、フォームの入力欄にコードを直接書いて、データベースに侵入する攻撃手法があるからです。この攻撃を、SQLインジェクションと言います。

フォームの入力値は、不正な値が入っていないかを必ず検証します。検証は、クライアントではなくサーバー側でやります。

クライアントは使う人の端末、サーバーは情報を処理するパソコン

クライアントは使う人のスマホやパソコン、サーバーは情報を処理するパソコンという役割の違いを左右に対比した図解

ここで、クライアントとサーバーというIT用語について解説します。

アプリは、クライアントとサーバーという2つの端末でプログラムが動いています。

クライアントは、アプリを使っている人のスマホやパソコンです。サーバーは、クライアントが画面に表示したり登録したりする情報を処理するパソコンです。

Xで考えると分かりやすいです。Xのタイムラインでは世界中の人の投稿を見られますが、その投稿データはスマホの中にはありません。スマホの中にあったら、あっという間に容量がいっぱいになってしまいます。

タイムラインは、クライアントであるスマホが、X社のサーバーから情報を取ってきて表示しています。Xで投稿した内容も、X社のサーバーに保存されます。

入力チェックは、オフにできないサーバー側でやる

クライアント側の入力チェックはJavaScriptをオフにされてすり抜けられるが、サーバー側のチェックはオフにできず必ず止める対比

入力チェックは、クライアントではなく必ずサーバーでやります。クライアントのチェックは、ユーザーが自由にオフにできるからです。

クライアント側の処理は主にJavaScriptというプログラムで書かれていて、JavaScriptはブラウザの機能でいつでもオフにできます。オフにされれば、クライアントでどれだけ厳重にチェックしていても意味がありません。

CSPで、許可した配信元以外のプログラムを実行させない

CSPのルールで自社サーバーのプログラムだけを実行し、外部の不正プログラムをブロックするブラウザの仕組み

フォームの最後の対策は、CSPです。CSPはコンテンツセキュリティポリシーの略で、どこから配信されたJavaScriptや画像なら、ブラウザが読み込んで実行してよいかを決める仕組みです。

たとえば、自分のアプリのサーバーから配信されたものはOK、それ以外はNG、といったルールをCSPで決められます。ChromeやSafariなどのブラウザは、このルールに沿ってJavaScriptや画像を扱います。

CSPを設定していないと、サイトやアプリを開いた人の情報を抜き取る不正なプログラムを仕込まれたとき、ブラウザはそれも実行してしまいます。

このように不正なプログラムを押し込む攻撃が、XSS(クロスサイトスクリプティング)です。XSSをされると、アプリやサイトを見た人が、不正なプログラムによって被害を受けます。

CSPでJavaScriptなどの実行を許可する配信元を決めておけば、外部の不正なプログラムを押し込まれても実行されません。

ただし、CSPだけを設定すれば安全というわけではありません。サーバー側の入力チェックなどの対策も、セットでやる前提です。

対策が面倒なら、Googleフォームを使う

Googleフォームならアクセス制限・bot対策・CSPが実装済みで、入力チェックだけ自分で確認する対比

フォーム1つのためにここまでの対策をするのが面倒なら、Googleフォームを置くのがおすすめです。Googleフォームは個人向けなら無料で使え、一通りのセキュリティ対策がすでに実装されています。

Googleフォームなら、入力チェック以外のセキュリティ対策は省略して大丈夫です。ただし、フォームの入力値を使って自分のアプリで何か処理をするなら、サーバー側での不正な値のチェックは必要です。

対策3:監視の仕組みで、アプリの異常にすぐ気づけるようにする

サーバーのメモリとデータベースの負荷を常に監視し、しきい値を超えたらSlack・LINE・メールへ通知する流れ

3つ目の対策は、監視です。監視とは、アプリの異常事態に気づける仕組みのことです。

たとえば、サーバーのメモリやデータベースの負荷を常に監視し、事前に決めたしきい値を超えたら通知します。通知先は、SlackやLINE、メールなど、何でもかまいません。とにかく異常に気づけることが重要です。

原因が何であれ、異常に気づけないのが問題

故障・攻撃・SNSでの話題化のどれが原因でも数値の異常に管理者が気づけず、アプリ停止や攻撃長期化につながる流れ

監視している値が普段とかけ離れた数値になったら、原因は次のいずれかです。

  • サーバーの故障
  • 攻撃による大量のアクセス
  • SNSやネットニュースで注目されたことによる、一時的なアクセスの増加

原因が何であれ、アプリの管理者が気づけないのは問題です。アプリが落ちてしまったり、長期間攻撃され続けたりするかもしれないからです。だから、公開しているアプリには必ず監視の仕組みを入れます。

監視できる項目を知り、何をどこへ通知するかを決める

メモリ・DB負荷・エラーログ・不正アクセスの監視項目から、通知先を決めて人へ知らせる流れ

監視の対象は、サーバーのメモリやデータベースの負荷のほかに、エラーログや、許可されていないアドレス・端末からのアクセスなどもよくあります。

Cloudflareなど、アプリのサーバーを置くためのホスティングサービスには、大抵監視の仕組みも付いています。まずはAIに聞くなどして、どんなものを監視できるかを知りましょう。

監視できるものが分かったら、アプリの異常に気づくために、何を監視して、どこへ通知するかを決めます。

対策4:データベースは、バージョン管理システムとは別にバックアップする

ソースコードはバージョン管理システムに入るが、容量が大きく履歴も不要なデータベースは入れないことの対比

4つ目の対策は、データベースのバックアップです。

アプリのソースコードは、一般的にGitHubなどのバージョン管理システムに入っているので、バージョン管理システム自体がバックアップにもなります。

GitやGitHubの仕組みは、Git・GitHubの初期設定と基本操作を解説した記事をご覧ください。

一方、データベースはバージョン管理システムに入れないのが一般的です。データベースは履歴を管理する意味がなく、バージョン管理システムに入れるには容量が大きすぎるからです。

アプリのデータは、期間が経つほどどんどんたまります。全部をバージョン管理システムに入れていたら、履歴が大きすぎて処理がどんどん重くなってしまいます。

バックアップがないと、データを失ったときに取り返しがつかない

誤操作やサイバー攻撃でデータを失っても、過去30日の任意の時点へ復元できる流れ

データベースのバックアップがないと、自分やAIの誤操作、サイバー攻撃でデータを失ったときに取り返しがつきません。だから、データベースのバックアップは、バージョン管理システムとは別に取ります。

バックアップの仕組みも、監視と同じく、Cloudflareなどのホスティングサービスに標準で用意されています。

たとえばCloudflareのデータベースのD1は、過去30日(無料プランは7日)の任意の時点に戻せるTime Travelが常に有効です。

多少運用や保管にコストがかかったとしても、データを失ったときの損失に比べれば安いものです。

まとめの前に、お知らせを。

AI活用、アプリ・Webサイト開発のご相談は公式LINEまたはお問い合わせページへ。現役エンジニアがAIと技術力を活かし、高品質・低コストで対応します。相談は無料です。

無料メルマガで実務で使えるAI活用を配信中。1分で登録できます。

超実践AI論Substacktaichiaiworker.substack.com

まとめ:4つのセキュリティ対策で、公開するアプリやサイトを守る

この記事の要点は次の4つです。

  • 機密情報はなるべく持たず、決済はStripe、ログインはパスキーやSSOに任せる
  • フォームは、アクセス制限、bot対策、サーバー側の入力チェック、CSPの4つで守る。面倒ならGoogleフォームとサーバー側の入力チェックで済ませる
  • サーバーのメモリやデータベースの負荷、エラーログなどを監視し、異常をすぐ通知する
  • データベースは、ホスティングサービスのバックアップで、消えてもすぐ取り戻せるようにする

ぜひ、4つの対策のうち、自分のアプリやサイトに足りないものがあれば導入してみてください。

この記事をシェア

無料30分相談で、困りごとをお聞かせください

お困りごとや業務内容をうかがい、最も費用対効果が高い解決策をご提案します。事前準備は不要で、オンライン・電話・対面に対応しています。