【入門編】 ビジネスロジック脆弱性:価格改ざん攻撃の検知と防御 – オフェンシブセキュリティ & リバースエンジニアリング防御ガイド

こんにちは!Webアプリの開発や、会社のホームページの管理などを任されるようになると、「セキュリティ」という言葉をよく耳にするようになりますよね。

「なんだか難しそうだな…」「ハッカーとかサイバー攻撃なんて、うちの会社には関係ないんじゃ…」なんて思っていませんか?

実は、特別な知識がなくても、インターネットのちょっとした仕組みの隙をついて、お店にお金を払わずに商品を持ち去ろうとするような「ずるい攻撃」が存在します。それが今回お話しする「ビジネスロジック脆弱性(価格改ざん攻撃)」です。

今回は、セキュリティに初めて触れる新人エンジニアのあなたに向けて、この攻撃がどんなものなのか、そしてどうやってお店(Webサイト)を守ればいいのかを、身近な例えを交えながら一歩ずつ優しく解説していきますね!

—

1. 家の鍵で例える「クライアントサイド」と「サーバーサイド」

まずは、Webサイトが動く仕組みを「自動販売機」や「お家」に例えて考えてみましょう。

皆さんが普段使っているスマホやパソコンの画面(ブラウザ)は、いわば「自分の手元にあるお財布やカバン」のようなものです。これをエンジニアの世界では「クライアントサイド」と呼びます。

一方で、お店のバックヤードや、商品の在庫が管理されている安全な金庫のような場所を「サーバーサイド」と呼びます。

ここで、こんなシチュエーションを想像してみてください。
お祭りの屋台で、焼きそばを1パック500円で売っています。店員さんが「お客さん、これ500円ね!」とあなたに値段を書いたメモを渡しました。

もし、あなたがそのメモをこっそりペンで書き換えて、「50円」と書き直して店員さんに渡したらどうなるでしょうか?
もし店員さんがうっかりしていて、メモの金額だけを見て「はい、50円ね!」と焼きそばを渡してしまったら……大変な大赤字ですよね!

Webサイトの価格改ざん攻撃も、これとまったく同じことが起きています。

—

2. 価格改ざん攻撃のメカニズム:なぜ値段が書き換えられてしまうのか?

Webサイトでお買い物をするとき、商品ページの裏側では、ブラウザ(あなたの手元)からサーバー(お店のバックヤード)へ向かって、「この商品を1個買いますよ」というメッセージが送られています。

悪意のある人は、このメッセージを途中でこっそり覗き見して、次のように書き換えてしまいます。

  • 本来のメッセージ: 「商品ID: 001, 価格: 10,000円, 数量: 1」
  • 改ざん後のメッセージ: 「商品ID: 001, 価格: 10円, 数量: 1」

初心者の開発者がやりがちな失敗として、「画面(ブラウザ)に表示されている値段」や「ボタンに設定された値段」をそのまま信用してしまうというものがあります。

例えば、以下のようなHTMLコードを見たことはありませんか?

<!-- 危険な例:ブラウザ側(HTML)に商品の価格を直接持たせているケース -->
<form action="/checkout" method="POST">
    <input type="hidden" name="product_id" value="item_123">
    <input type="hidden" name="product_name" value="超高級腕時計">
    <!-- ここに価格をそのまま書いているのが大間違いの元! -->
    <input type="hidden" name="price" value="50000">
    <button type="submit">購入する</button>
</form>

このコードの場合、ブラウザの「要素の検証(デベロッパーツール)」という機能を使うと、ユーザーは誰でも簡単に value="50000" を value="10" に書き換えて送信できてしまいます。

「えっ、そんな簡単に直せるの!?」と思いますよね。そう、手元の画面にある情報は、ユーザーにとって「粘土細工」のようにいくらでも形を変えられるものなのです。

—

3. 「絶対にやってはいけないこと」と「正しい防御の仕組み」

では、このずるい価格改ざんからお店を守るにはどうすればよいのでしょうか?
答えはとてもシンプルです。

「お客さんが手元から送ってきた値段は、一切信用しない!」

これにつきます。先ほどの屋台の例で言えば、客が「50円のメモです」と言ってきても、店員さんはそのメモを信じず、「いやいや、うちのマスターデータ(商品台帳)を確認したら、この商品は定価5,000円だよ!」と、自分の手元の正しい台帳を見て計算し直さなければいけません。

これをシステムの言葉で「サーバーサイドでの価格再計算(整合性チェック)」と呼びます。

安全な実装のサンプルコード(PHPの例)

それでは、サーバー側でどのように値段を守ればいいのか、具体的なコードを見てみましょう。難しく考えず、「お店の台帳をちゃんと見ているか」という視点で読んでみてくださいね。

<?
// 1. ユーザーから送られてきたのは「どの商品を買いたいか(商品ID)」と「数量」だけにする
$productId = $_POST['product_id']; // 例: "item_123"
$quantity  = (int)$_POST['quantity']; // 例: 1個

// 2. サーバー側(安全なデータベースや設定ファイル)にある「商品台帳」を呼び出す
// ※価格は絶対にブラウザから受け取らず、ここで定義されている正しい金額を使う!
$productCatalog = [
    'item_123' => [
        'name' => '超高級腕時計',
        'price' => 50000 // 正しい価格はサーバーが握っている
    ],
    'item_999' => [
        'name' => '特製Tシャツ',
        'price' => 3000
    ]
];

// 3. 送られてきた商品IDが、ちゃんと台帳に存在するかチェックする
if (!isset($productCatalog[$productId])) {
    // 存在しない商品ならエラーにする
    die("エラー:存在しない商品です。");
}

// 4. サーバー側の正しい価格を使って合計金額を計算する!
$unitPrice = $productCatalog[$productId]['price'];
$totalPrice = $unitPrice * $quantity;

// 5. 計算した正しい金額で決済処理や注文確定を行う
// (これで、ユーザーが勝手に値段を10円に書き換えても無視されます!)
echo "ご注文ありがとうございます! お支払い金額は " . $totalPrice . " 円です。";
?>

このように、「値段は必ずサーバー側のデータベースから引き出す」という鉄則を守るだけで、価格改ざん攻撃は完璧に防ぐことができます。

—

4. セキュリティに初めて触れるあなたへ贈るアドバイス

今回はビジネスロジックの脆弱性、中でも「価格改ざん」というテーマについてお話ししました。

サイバー攻撃と聞くと、なんだか映画に出てくるような高度なプログラミング技術が必要なイメージがあるかもしれません。しかし、今回のような脆弱性は、開発者の「ちょっとした思い込み(ユーザーは画面の通りに操作してくれるはずだという信頼)」の隙をつく、非常にシンプルな仕組みで起こります。

だからこそ、私たちがアプリを作るときは、いつも心の中にこう問いかけるようにしましょう。

  • 「このデータ、ユーザーが勝手に書き換えて送ってくる可能性はないかな?」
  • 「大事な計算や判定を、ブラウザ(手元)だけでやっていないかな?」

セキュリティ対策は、一度コツを掴んでしまえば、日々のコーディングの習慣として自然に身につけていくことができます。
「一歩ずつ、安全なコードの書き方を学んでいけば大丈夫!」
ぜひ、明日からの開発やコードレビューでこの視点を思い出してみてくださいね。応援しています!

コメント

タイトルとURLをコピーしました