htmlspecialchars()は、XSSを防ぐ機能です(クロスサイトスクリプト攻撃)。その目的は、HTML( < 、 > 、 && )の特殊文字をHTMLエンティティに変換して、ユーザーがページで実行されるのを防ぐことを防ぐことです。たとえば
<?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>
出力の結果は次のとおりです。
<script>alert("XSS")</script>
このコードは、HTMLへの悪意のあるJavaScript注入を効果的に防止しますが、これはCSRF攻撃の防御とはほとんど直接的な関係を持っていません。
CSRFは、ユーザーの「ログインステータス」を使用します。攻撃者は、ユーザーにリンクをクリックするか、画像/iframeにアクセスするように誘導し、特定のWebサイトでユーザーの現在のログインステータスを使用してリクエストを行います。例えば:
<img src="https://m66.net/delete_account.php" />
ユーザーがM66.NETにログインし、サーバーが確認を行っていない場合、この要求は実際にユーザーアカウントを削除する場合があります。
この攻撃の鍵は、ユーザーが州の変更の要求を情報にしておらず、サーバーがリクエストを信頼することです。
htmlspecialchars()は「出力段階」で動作し、主にブラウザが悪意のあるスクリプトを解析することを防ぎます。 CSRF攻撃は、自動的に開始された要求であるか、ユーザーのブラウザによって誘導される要求であり、ページに出力がない場合でも、トリガーされる可能性があります。
言い換えれば、CSRFは「ユーザーの身元を偽装するリクエスト」であり、出力コンテンツが逃げられたかどうかとは何の関係もありません。したがって、 htmlspecialchars()はCSRF攻撃を防止しません。
CSRFトークンを使用します
最も効率的な方法は、ランダムに生成されたCSRFトークンをフォームに追加し、リクエストを処理するときに検証することです。例えば:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form method="POST" action="https://m66.net/update_profile.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
<!-- 他のフォームフィールド -->
<button type="submit">提出する</button>
</form>
<?php
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("違法リクエスト!");
}
// 更新操作を実行します
}
?>
参考文献またはオリジンヘッダーを確認します
完全に依存することはできませんが、一部のシナリオでリクエストが合法かどうかを判断するのに役立ちます。例えば:
<?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (parse_url($referer, PHP_URL_HOST) !== 'm66.net') {
die("違法な情報源");
}
?>
Samesite Cookie属性を使用します
最新のブラウザは、samesite = strictまたはsamesite = laxのCookie属性を設定することにより、サードパーティがCookieを要求することを妨げるサポート:
setcookie('session_id', $value, [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);