次はどういったキーワードで記事を書こうかと色々調べていたら、クロスサイトスクリプティングとSQLインジェクションの違いに関して検索する人が一定数いることに気づきました。
というわけで今回の記事ではこれら2つの違いについて解説していこうと思います。
技術的な詳細は今回の記事では割愛している部分もありますが、詳細については他のWebサイトを調べていただくか以下の書籍を参考にすることを推奨します。
クロスサイトスクリプティングとは?
まずはクロスサイトスクリプティングに関する説明です。クロスサイトスクリプティングとは入力フォームから悪意のあるJavascriptを挿入し不正にWebサイトを改ざんしたり、ユーザーがECサイトで利用するようなセッションIDを盗んだりすることを指します。
例えば以下のような入力フォームがあったとしましょう。「送信」を押すと2番目の画像のページに遷移します。この入力フォームにはクロスサイトスクリプティング脆弱性があり、レイアウトの改竄が可能になっています。今回はクロスサイトスクリプティングとSQLインジェクションの違いに関する記事なのでソースコードについての細かい説明は割愛しますが、気になる方は各自で調べてみてください。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>簡単な入力フォーム</title>
</head>
<body>
<div class="container">
<h1>お問い合わせフォーム</h1>
<form action="XSS_confirm.php" method="post">
<div class="form-group">
<label for="name">お名前:</label>
<input type="text" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<input type="submit" value="送信">
</div>
</form>
</div>
</body>
</html>

//XSS_confirm.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>フォームデータ</title>
</head>
<body>
<div class="container">
<h2>送信されたデータ:</h2>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST["name"];
$email = $_POST["email"];
echo "<p>お名前: $name</p>";
echo "<p>メールアドレス: $email</p>";
} else {
echo "<p>不正な遷移です。</p>";
}
?>
</div>
</body>
</html>
この入力フォームに対して例えば以下のようなJavaScriptを入力すると遷移後の画面にてアラートのダイアログが表示され、JavaScriptが実行可能であることを確認できます。


これだけでは影響が分かりにくいと思うのでより実践的な悪用のサンプルを用意しました。以下のJavaScriptは確認の画面を改竄しカジノサイトへ誘導するリンクを作成するスクリプトです。このJavaScriptを実行すると、Webサイトが改竄されてしまいます。
<script>var linkContainer=document.createElement("div");linkContainer.className="container";var linkHeader=document.createElement("h2");linkHeader.textContent="リンク:";var link=document.createElement("a");link.href="";link.target="_blank";link.textContent="カジノサイトへのリンクはこちら";linkContainer.appendChild(linkHeader);linkContainer.appendChild(link);document.body.appendChild(linkContainer);</script>


もともとは確認の画面に名前とメールアドレスだけが表示されていましたが、架空のカジノサイトへのリンクが追加されてしまいました。いかがでしょう?JavaScriptを利用して画面を改竄できることが理解できたかと思います。こういったJavaScriptを利用してWebサイトを改竄したり、ログインのあるサイトでセッションIDを抜き出して外部に送信することをクロスサイトスクリプティングと言います。
SQLインジェクションとは?
続いてSQLインジェクションです。SQLインジェクションは先ほどのクロスサイトスクリプティングとは異なり、入力フォームにSQLを入力して、不正にデータベースを参照・操作することを指します。これによりデータベースに氏名や住所などの個人情報が入っていた場合、SQLインジェクションにより個人情報の漏洩やデータの改竄がおこなわれることになります。
こちらも文面だけでは分かりにくいのでサンプルを見ていきましょう。以下のフォームを用意しました。「Search」ボタンを押下すると2つ目の画面に遷移しますが、このフォームにはSQLインジェクションの脆弱性が混入しています。

<!DOCTYPE html>
<html>
<head>
<title>SQL Injection</title>
</head>
<body>
<form method="POST" action="search.php">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<input type="submit" value="Search">
</form>
</body>
</html>

<?php
$user_input = $_POST['name'];
$connection = mysqli_connect("localhost", "security", "test", "sqlinjection");
$query = "SELECT * FROM address WHERE name = '" . $user_input . "';";
$result = mysqli_query($connection, $query);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "ユーザー名: " . $row['name'] . "<br>";
echo "パスワード: " . $row['password'] . "<br>";
}
} else {
echo "データが見つかりませんでした。";
}
mysqli_close($connection);
?>
データベースに保存されているデータは以下の通りです。

ではSQLインジェクションを使って悪用してみましょう。ここではデータベースに登録されているデータを一括で抜き出すことを目標にし、データの検索フォームに以下の文字列を入力します。本来であれば「name」のカラムに「tanaka」、「sato」を除いたデータは存在しませんので結果は得られないことが正しいと想定されますが、実際は全てのデータが参照できてしまいます。


SQLでデータを取得する際以下のWHERE句以降で参照するデータの絞り込みを行っていますが、上の検索フォームで入力した文字列はこのWHERE句以降の条件が常にTrueになるものをいれています。これによりSELECT文で全てのデータを抜き出すことが可能になるというわけです。
$query = "SELECT * FROM address WHERE name = '" . $user_input . "';";
今度はSQLを利用してデータベースの情報を不正に参照する例を取り上げました。勿論参照だけでなくデータベースに不正なデータを追加したり、逆に削除を行うことも可能です。このようにSQLを利用してデータベースを不正に参照、操作することをSQLインジェクションと言います。
【まとめ】XSSとSQLインジェクションの違い
ここまででSQLインジェクションとクロスサイトスクリプティングについてそれぞれ解説してきました。これらの脆弱性についての大きな特徴をまとめると以下の表の通りになります。
まとめ
・SQLを悪用するのがSQLインジェクション、JavaScriptを悪用するのがクロスサイトスクリプティング
・SQLインジェクションはデータベースを不正に参照、操作して機密情報を抜き出したり削除される影響がある
・クロスサイトスクリプティングはWebサイトを改竄したりセッションIDが盗まれる影響がある