WEB制作WEBのセキュリティ対策について

WEBのセキュリティ対策について

各攻撃がどのように行われるか、攻撃の原理、具体的なコード例、
およびWordPressでの対策について解説します。


1. クロスサイトスクリプティング(XSS)

原理

XSSは、ユーザーが入力したスクリプトがサーバーで正しく処理されずに、そのままWebページに出力される場合に発生します。悪意のあるユーザーは、入力フォームやURLを通じてJavaScriptコードを挿入し、被害者のブラウザで実行させることが可能です。

攻撃例(JavaScriptインジェクション)

<input type="text" name="comment" value="<script>alert('XSS');</script>">

この場合、コメント欄に挿入されたスクリプトがそのままブラウザで実行され、アラートが表示されます。

WordPressでの対策

  • wp_kses関数を使用: wp_kses関数は、許可されたHTMLタグや属性を指定して入力をエスケープします。
$sanitized_comment = wp_kses($_POST['comment'], array('p' => array()));
echo $sanitized_comment;

このコードは<p>タグだけを許可し、それ以外のタグや属性は削除します。

  • エスケープ関数: 出力時にesc_html()esc_attr()などの関数を使用して、JavaScriptコードの埋め込みを防ぎます。
echo esc_html($_POST['comment']);

2. セッションハイジャック

原理

セッションIDが盗まれると、攻撃者が正当なユーザーのセッションを引き継ぎ、ユーザーに成りすますことができます。これは、セッションIDが暗号化されていない場合や、セッションIDがURLに含まれる場合に発生します。

攻撃例(セッション固定)

// 攻撃者があらかじめ固定のセッションIDを設定
session_id('fixed_session_id');
session_start();

攻撃者は被害者に固定されたセッションIDを使用させ、そのセッションを乗っ取ります。

WordPressでの対策

  • HTTPSの使用: WordPressでは、wp-config.phpに以下を追加してSSLを強制します。
define('FORCE_SSL_ADMIN', true);
  • セッションのタイムアウト: WordPressでは標準でセッション管理を行わないため、セッション管理用プラグインを使用し、タイムアウト設定を行うのが一般的です。
  • HTTPOnlyクッキー設定: WordPressのsetcookie関数にHTTPOnly属性を付加して、クッキーがJavaScriptからアクセスされないようにすることができます。
setcookie('wordpress_logged_in', $session_value, time() + 3600, '/', '', true, true);

3. SQLインジェクション

原理

SQLインジェクションは、ユーザーが入力したデータが直接SQLクエリに埋め込まれる際に発生します。攻撃者はSQL文を操作し、データベース内の情報を不正に取得、更新、または削除することが可能です。

攻撃例

// ユーザー入力がそのままSQLに埋め込まれる
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$username'";

攻撃者が' OR '1'='1のような入力を行うと、クエリは常に真となり、すべてのユーザー情報が取得されます。

WordPressでの対策

  • プリペアドステートメントの使用: WordPressでは、データベースクエリを実行する際に$wpdbオブジェクトを使用し、SQLインジェクションを防ぐためにプレースホルダを利用します。
global $wpdb;
$username = $_POST['username'];
$query = $wpdb->prepare("SELECT * FROM users WHERE username = %s", $username);
$results = $wpdb->get_results($query);

このように$wpdb->prepareを使うことで、ユーザー入力が適切にエスケープされます。


4. クロスサイトリクエストフォージェリ(CSRF)

原理

CSRFは、認証されたユーザーが意図しない操作を実行させられる攻撃です。ユーザーが信頼するサイトにログインしたまま、攻撃者が用意した偽のフォームを実行させることで、ユーザーに代わって不正な操作を行わせます。

攻撃例

<!-- 攻撃者が用意したフォーム -->
<form action="https://vulnerable-site.com/delete-account" method="POST">
<input type="hidden" name="user_id" value="1">
<input type="submit" value="Delete Account">
</form>

ユーザーがこのページを開くと、アカウント削除リクエストが送信されてしまいます。

WordPressでの対策

  • CSRFトークンの使用: WordPressでは、wp_nonce_field()を使用してCSRFトークンを生成し、フォームに追加します。
<form method="post">
<?php wp_nonce_field('delete_account_action'); ?>
<input type="hidden" name="user_id" value="1">
<input type="submit" value="Delete Account">
</form>

サーバー側でcheck_admin_referer()を使ってトークンを検証します。

if ( ! check_admin_referer('delete_account_action') ) {
wp_die('CSRF検証に失敗しました');
}

5. クリックジャッキング

原理

クリックジャッキングは、透明なフレームを使用して、ユーザーが意図しないリンクやボタンをクリックさせる攻撃です。たとえば、ユーザーが見えないフレーム内の危険なボタンをクリックすることで、不正な操作が行われます。

攻撃例

<!-- 攻撃者が透明なフレームを仕込んだページ -->
<iframe src="https://vulnerable-site.com" style="opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></iframe>

ユーザーは目に見える自分のサイトを操作しているように見えても、実際には攻撃者の仕掛けた透明なフレームをクリックしています。

WordPressでの対策

  • X-Frame-Optionsヘッダーの設定: WordPressサイトでフレーム内に表示されないようにするためには、X-Frame-Optionsヘッダーを設定します。これはプラグイン「HTTP Headers」を使用するか、functions.phpに次のコードを追加して行えます。
add_action('send_headers', 'add_security_headers');
function add_security_headers() {
header('X-Frame-Options: SAMEORIGIN');
}

これにより、同一オリジンからのフレーム表示のみが許可されます。

laravelの場合はどうする?

1. クロスサイトスクリプティング(XSS)

原理

XSSは、ユーザーの入力が適切にエスケープされない場合、悪意のあるスクリプトがブラウザで実行されることによって発生します。

攻撃例(JavaScriptインジェクション)

<input type="text" name="comment" value="<script>alert('XSS');</script>">

このスクリプトが実行されると、アラートが表示されます。

Laravelでの対策

  • Bladeテンプレートのエスケープ機能: Laravelでは、BladeテンプレートがデフォルトでXSS攻撃に対する保護を提供します。変数の出力時に{{ $variable }}を使用することで、HTMLエスケープが自動的に行われます。
{{ $comment }}

これにより、ユーザーの入力に含まれるスクリプトは自動的にエスケープされます。

  • e()関数を使用したエスケープ: プログラム内で出力する際にもe()関数を使用して、手動でエスケープできます。
echo e($comment);

2. セッションハイジャック

原理

セッションIDを盗むことで、攻撃者はユーザーのセッションにアクセスし、不正な操作を行うことが可能です。これがセッションハイジャックです。

Laravelでの対策

  • HTTPSの使用: Laravelでは、config/session.phpでセッションをsecureモードに設定し、HTTPS経由でのみセッションIDを送信できます。
'secure' => env('SESSION_SECURE_COOKIE', true),
  • セッションIDの再生成: Laravelでは、ログイン後にセッションIDを再生成して、セッション固定攻撃を防ぎます。これは、login()メソッドを使用する際に自動的に行われます。
Auth::login($user, true); // trueはリメンバーオプション
  • HTTPOnlyクッキー設定: LaravelのセッションはデフォルトでHTTPOnlyに設定されており、クッキーはJavaScriptからアクセスできません。これはconfig/session.phpで設定できます。
'http_only' => true,

3. SQLインジェクション

原理

SQLインジェクションは、悪意のあるSQL文がユーザー入力を通じてデータベースクエリに組み込まれることで発生します。これにより、データの漏洩や削除などが引き起こされます。

攻撃例

// ユーザー入力をそのままSQLに挿入する脆弱なコード
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$username'";

この場合、ユーザーが' OR '1'='1を入力すると、SQLクエリが常に真となり、すべてのユーザー情報が取得されます。

Laravelでの対策

  • Eloquent ORMの使用: LaravelのEloquent ORMを使用すると、SQLインジェクションを防ぐために自動的にエスケープされます。
$user = User::where('username', $request->input('username'))->first();
  • クエリビルダでのプレースホルダ使用: Laravelのクエリビルダでは、プリペアドステートメントがデフォルトで使用され、ユーザー入力が安全にエスケープされます。
$users = DB::table('users')->where('username', $request->input('username'))->get();

4. クロスサイトリクエストフォージェリ(CSRF)

原理

CSRFは、ユーザーが意図しないリクエストを送信させられる攻撃です。攻撃者は、ユーザーがログインしていることを利用して、不正な操作を実行させます。

Laravelでの対策

  • CSRFトークンの使用: LaravelはデフォルトでCSRF保護機能が組み込まれており、すべてのフォームリクエストにCSRFトークンが含まれます。Bladeテンプレートでcsrf_field()を使用してフォームにトークンを追加します。
<form method="POST" action="/submit">
@csrf
<input type="text" name="name">
<button type="submit">Submit</button>
</form>
  • ミドルウェアによる検証: VerifyCsrfTokenミドルウェアがLaravelに組み込まれており、トークンが一致しないリクエストは拒否されます。

5. クリックジャッキング

原理

クリックジャッキングは、透明なフレームを使用してユーザーのクリックを不正なリンクやボタンに誘導する攻撃です。

Laravelでの対策

  • X-Frame-Optionsヘッダーの設定: Laravelでは、X-Frame-Optionsヘッダーを設定することで、クリックジャッキングを防止します。app/Http/Middleware/FrameGuard.phpを作成し、SAMEORIGINを設定します。
namespace App\Http\Middleware;

use Closure;

class FrameGuard
{
public function handle($request, Closure $next)
{
$response = $next($request);
return $response->header('X-Frame-Options', 'SAMEORIGIN');
}
}
  • このミドルウェアをKernel.phpに登録します。
protected $middleware = [
// 他のミドルウェア...
\App\Http\Middleware\FrameGuard::class,
];

これらのセキュリティ対策をLaravelアプリケーションに実装することで、XSS、セッションハイジャック、SQLインジェクション、CSRF、クリックジャッキングの脅威からアプリケーションを保護できます。