はじめに
web開発をする上で、脆弱性を考えることは避けて通れません。
悪意のある人は、セキュリティ上の穴や弱みを巧みに利用し、サイバー攻撃やデータの取得といった攻撃を仕掛けてくるからです。
エンジニアはそれらを把握し、実装段階や運用している最中でも気づいたらいち早く対策を講じなければなりません。
今回紹介する脆弱性は、「3大脆弱性」とも呼ばれWeb開発をする上での必須知識です。
SQLインジェクション
概要
SQLインジェクションは、攻撃者が悪意のあるSQLコードを入力フィールド(phpのform等)に挿入し、それがデータベースに実行されることによって発生する脆弱性です。
成功すると攻撃者は、データベース内の機密情報にアクセス、改ざん、削除することが可能になってしまいます。
例)ログインフォームに` ‘OR 1 = 1 ` といったような入力を行う事で、SQLクエリ全体がTRUE判定され、不正なログインが可能になる場合があります。
対処法
入力のサニタイズとバリデーション
・ユーザからの入力は常に疑い、特殊文字やSQLコマンドをエスケープする。
・数値のみが期待されるフィールドでは、数値以外の入力を拒否する。
※サニタイズ:ユーザ入力や外部からのデータを処理する際に、そのデータから不正な内容を除去したり、安全な形式に変換したりすること。
※特殊文字:プログラミングやデータ処理において特別な意味の機能を持つ文字のこと。
パラメータ化されたクエリ
・SQLクエリにパラメータを使用することで、ユーザ入力をSQL文の一部として解釈しないようにする。
・例えばPHPでは、「PDO」を用いることにより簡単にパラメータ化クエリを実装できます。
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->execute(['username' => $username, 'password' => $password]);
ストアドプロシージャの利用
・SQLロジックをデータベース側で管理するストアドプロシージャを使用し、直接的なSQLクエリの構築を避ける。
データベース権限の最小化
・データベースユーザには必要最低限の権限のみ与える。例えば、アプリケーションが読み取り専用の場合、書き込み権限を与えない。
SQLインジェクションはこのような対策が考えられます。
クロスサイトスクリプティング(Cross-Site Scripting, XSS)
概要
XSSは、攻撃者が悪意のあるスクリプトを他のユーザのブラウザで実行させる脆弱性のことです。
これにより、攻撃者はCookieの盗難・セッションの乗っ取り・ページの改ざんなどを行うことができます。
対処法
エスケープ処理
・ユーザからの入力をHTMLやJavaScriptに挿入する際に、適切にエスケープ処理を行う。
・例えばPHPでは、htmlspecialchars関数を使用することで対処可能。
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
入力の検証とサニタイズ
・ユーザからの入力を受け取る際には、期待される形式や長さを検証し、不正な入力を排除する。
セキュアなJavaScriptコーティング
・JavaScriptのDOM操作を行う際には、信頼できないデータを直接入力しないようにする。
・例えば、’innerHTML’の使用を避け、代わりに’textContent’や’createElement’を使用する。
XSSはこのような対策が考えられます。
クロスサイトリクエストフォージェリ(Cross-Site Request Forgery, CSRF)
概要
CSRFは、攻撃者が脆弱者のブラウザを介して、被害者が認証済みのサイトに対して不正なリクエストを送信させる脆弱性です。
これにより、攻撃者はユーザの意図しないアクション(例えばパスワード変更や送金)を実行させることが可能になります。
対処法
CSRFトークンの使用
・フォームの重要なアクションに対して、CSRFトークンを使用することでリクエストが正当なものであることを確認する。
// トークン生成
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
// トークン検証(php)
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
// CSRF攻撃の可能性
exit('Invalid CSRF token');
}
SamaSite属性の設定
・Cookieに’SamaSite‘属性を設定することで、同一サイトからのリクエストのみCookieを送信するようにする。
Set-Cookie: sessionId=abc123; SameSite=Strict;
Refererヘッダの検証
・リクエスト元が正当なものであるか確認するために、Refererヘッダを検証する。
・ただし、Refererヘッダは必ずしも送信されるとは限らないため、補助的な対策として使用する。
Cookieのセキュア属性
・セッション管理に使用するCookieには‘HttpOnly’と’Secure‘属性を設定する。
・これにより、JavaScriptからのアクセスを防ぎ、HTTPS接続時のみCookieを送信するようにする。
Set-Cookie: sessionId=abc123; HttpOnly; Secure;
CSRFはこのような対策が考えられます。
まとめ
以上がWebセキュリティにおける3大脆弱性と対処法でした。
今回述べた対策を適切に実施することで、Webアプリケーションのセキュリティを大幅に向上させることができます。
今回は3大脆弱性という事で上記の脆弱性のみを調査しましたが、3つ以外の脆弱性も勿論存在します。
私としてはこれらの概念・対策法を言語化して説明できるようにすること、そして実際の業務でも高いレベルで使えるように一つずつ覚えていきたいです。
セキュリティに関する他の記事はこちら。
コメント
[…] webセキュリティを語る上で押さえたい【3大脆弱性】について […]
[…] webセキュリティを語る上で押さえたい【3大脆弱性】について […]
[…] エンジニア / セキュリティ […]
[…] webセキュリティを語る上で押さえたい【3大脆弱性】について […]
[…] セキュリティ […]
[…] セキュリティ […]
[…] セキュリティ […]
[…] セキュリティ […]