【PHP8.x】FILTER_SANITIZE_STRIPPED定数の使い方
FILTER_SANITIZE_STRIPPED定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
FILTER_SANITIZE_STRIPPED定数は、入力されたデータからHTMLタグ、PHPタグ、特殊文字、および複数の空白文字などを取り除き、純粋なプレーンテキストとして安全に処理するためのサニタイズフィルターを表す定数です。この定数は、主にfilter_var()関数やfilter_input()関数といったPHPのフィルター機能と組み合わせて使用されます。
ウェブアプリケーションにおいて、ユーザーからの入力値には、悪意のあるスクリプトや不要な書式が含まれている可能性があります。例えば、ユーザーが入力フォームにHTMLタグやJavaScriptコードを混入させ、それがそのままウェブページに表示されると、クロスサイトスクリプティング(XSS)のようなセキュリティ上の脆弱性につながる恐れがあります。FILTER_SANITIZE_STRIPPEDを使用すると、このような潜在的な危険性のある要素を自動的に除去し、安全なテキストデータのみを抽出できます。
この定数を適用することで、データベースに保存する前にデータをクリーンアップしたり、ウェブページに表示する際に不要な書式や不正なコードが実行されるのを防いだりすることが可能になります。特に、ユーザーが自由にテキストを入力するようなコメント欄やメッセージボードなどで利用すると効果的です。ただし、このフィルターは非常に強力な除去を行うため、もしHTMLタグなど特定のフォーマットを意図的に保持したい場合には適しません。その場合は、目的と文脈に応じて他のサニタイズフィルターやエスケープ処理を検討する必要があります。この定数は、アプリケーションのセキュリティを向上させ、データの整合性を保つ上で重要な役割を果たします。
構文(syntax)
1<?php 2$malicious_input = "<script>alert('XSS');</script>ユーザー名"; 3$safe_output = filter_var($malicious_input, FILTER_SANITIZE_STRIPPED); 4echo $safe_output; 5?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP FILTER_SANITIZE_STRIPPEDでXSS対策する
1<?php 2 3/** 4 * 入力文字列からHTMLタグを除去し、サニタイズされた文字列を返します。 5 * この関数は、ウェブページにユーザー入力を表示する際に、XSS(クロスサイトスクリプティング)などの 6 * セキュリティリスクを軽減するために利用できます。 7 * 8 * FILTER_SANITIZE_STRIPPED は、PHP 8.0で非推奨となった FILTER_SANITIZE_STRING と同様に、 9 * 文字列からHTMLタグを取り除く目的で使用されるフィルターです。 10 * これは、PHPの組み込み関数 strip_tags() と同等の機能を提供します。 11 * 12 * @param string $input サニタイズする元の文字列。 13 * @return string サニタイズ処理後の文字列。 14 */ 15function cleanHtmlTags(string $input): string 16{ 17 // filter_var関数は、指定されたフィルターオプションに従ってデータをサニタイズします。 18 // ここでは FILTER_SANITIZE_STRIPPED を使用し、入力文字列からすべてのHTMLタグを除去します。 19 $sanitizedString = filter_var($input, FILTER_SANITIZE_STRIPPED); 20 21 return $sanitizedString; 22} 23 24// --- サンプル使用例 --- 25 26// HTMLタグを含むユーザー入力のシミュレーション 27$comment = "<p>こんにちは!</p><b>これは重要なメッセージです。</b><script>alert('危険なスクリプト!');</script>通常テキスト。"; 28 29echo "--- 元の入力文字列 ---" . PHP_EOL; 30echo $comment . PHP_EOL . PHP_EOL; 31 32// サニタイズ関数を適用 33$safeComment = cleanHtmlTags($comment); 34 35echo "--- サニタイズ後の文字列 ---" . PHP_EOL; 36echo $safeComment . PHP_EOL; 37 38?>
このPHPコードは、ウェブアプリケーションでユーザーからの入力など、外部から受け取った文字列を安全に「サニタイズ」(無害化)する方法を示しています。具体的には、文字列に含まれるHTMLタグを除去し、XSS(クロスサイトスクリプティング)といったセキュリティ上の脅威からシステムを保護することを目的としています。
サンプルコードの中心は、filter_var関数と組み合わせて使用される定数FILTER_SANITIZE_STRIPPEDです。この定数は、指定された文字列からHTMLタグをすべて取り除くための「フィルター」として機能します。PHP 8.0以降ではFILTER_SANITIZE_STRINGが非推奨となり、本定数のように具体的な意図を示すフィルターを使用することが推奨されています。これは、PHPの組み込み関数であるstrip_tags()と類似した機能を提供し、悪意のあるスクリプトの埋め込みを防ぐのに役立ちます。
cleanHtmlTags関数は、このFILTER_SANITIZE_STRIPPEDフィルターを適用するためのものです。
- 引数:
$inputとして、HTMLタグが含まれる可能性のある元の文字列を渡します。例えば、ユーザーが入力したコメントや投稿内容などが該当します。 - 戻り値:関数は、入力文字列からすべてのHTMLタグが取り除かれた、安全な文字列を返します。
コードの実行例では、<p>や<b>といった通常のHTMLタグに加え、<script>タグのような危険な要素を含む文字列が用意されています。cleanHtmlTags関数を適用すると、これらのタグがすべて除去され、純粋なテキストデータのみが出力されることが確認できます。このように、FILTER_SANITIZE_STRIPPEDは、表示する前に文字列を無害化し、ウェブアプリケーションのセキュリティを強化するために非常に重要な役割を果たします。
FILTER_SANITIZE_STRIPPEDは、入力文字列からHTMLタグをすべて除去し、XSS(クロスサイトスクリプティング)などのセキュリティリスクの一部を軽減するために利用されるフィルタです。PHP 8.1で削除されたFILTER_SANITIZE_STRINGとは異なり、このフィルタは主にタグの除去に特化しています。そのため、タグ除去のみでは全てのセキュリティ脅威に対応できるわけではありません。このフィルタはPHPの組み込み関数strip_tags()と機能的に同等です。ウェブページにユーザー入力を表示する際は、タグ除去に加えて、htmlspecialchars()などの関数を用いて特殊文字を適切にエスケープすることが非常に重要です。利用する場面や出力先に応じて、複数のサニタイズ・エスケープ処理を組み合わせることで、より安全なアプリケーションを構築してください。
PHP FILTER_SANITIZE_STRIPPEDでタグを削除する
1<?php 2 3/** 4 * HTMLタグを削除して文字列をサニタイズします。 5 * 6 * FILTER_SANITIZE_STRIPPED は、入力文字列からすべてのHTMLタグとPHPタグを除去するフィルターです。 7 * これにより、ユーザーからの入力に含まれる可能性のある悪意のあるHTML(例: XSSスクリプト)が 8 * 実行されるのを防ぎ、表示を安全に保ちます。 9 * 10 * キーワード「filter_sanitize_full_special_chars」がもし「HTML特殊文字のエスケープ」を意図する場合、 11 * PHPには FILTER_SANITIZE_SPECIAL_CHARS という別のフィルターがあり、こちらは特殊文字(<, >, &, ", 'など)を 12 * HTMLエンティティ(<, >, &, ", 'など)に変換します。 13 * FILTER_SANITIZE_STRIPPED はタグの除去に特化しており、特殊文字のエスケープとは挙動が異なります。 14 * 15 * @param string $input サニタイズする入力文字列 16 * @return string サニタイズされた文字列 17 */ 18function sanitizeHtmlInput(string $input): string 19{ 20 // filter_var関数と FILTER_SANITIZE_STRIPPED 定数を使用して文字列をサニタイズします。 21 // このフィルターは、HTMLタグやPHPタグを全て除去します。 22 // 例: "<b>Hello</b> <script>alert('XSS')</script>" は "Hello alert('XSS')" になります。 23 return filter_var($input, FILTER_SANITIZE_STRIPPED); 24} 25 26// ユーザーからの入力として想定される危険な文字列の例 27$unsafeInput = "<p>こんにちは、<b>世界</b>!</p> <script>alert('XSS攻撃!');</script> & '"; 28 29// サニタイズ処理を実行 30$safeOutput = sanitizeHtmlInput($unsafeInput); 31 32echo "元の文字列: " . $unsafeInput . PHP_EOL; 33echo "サニタイズされた文字列 (FILTER_SANITIZE_STRIPPED): " . $safeOutput . PHP_EOL; 34 35// 別の入力例 36$anotherUnsafeInput = "ユーザー名: <a href='javascript:alert(\"Bad\")'>クリックミー</a>"; 37$anotherSafeOutput = sanitizeHtmlInput($anotherUnsafeInput); 38 39echo PHP_EOL; // 見やすくするための改行 40echo "別の元の文字列: " . $anotherUnsafeInput . PHP_EOL; 41echo "別のサニタイズされた文字列 (FILTER_SANITIZE_STRIPPED): " . $anotherSafeOutput . PHP_EOL; 42 43?>
このサンプルコードは、PHPで文字列に含まれるHTMLタグやPHPタグを安全に除去する方法を示しています。これは、ウェブアプリケーションにおいてユーザーからの入力データに含まれる可能性のある悪意のあるコード(クロスサイトスクリプティング、XSS攻撃など)を防ぎ、ウェブページの表示を安全に保つための「サニタイズ」という処理に利用されます。
FILTER_SANITIZE_STRIPPEDは、PHPのfilter_var関数と共に使用する定数で、この定数を指定すると、入力された文字列からすべてのHTMLタグやPHPタグが除去されます。例えば、「<p>こんにちは</p><script>alert('XSS');</script>」のような文字列は、「こんにちはalert('XSS');」のように変換されます。
サンプルコード内のsanitizeHtmlInput関数は、サニタイズしたい文字列を引数($input)として受け取ります。そして、filter_var関数とFILTER_SANITIZE_STRIPPEDを用いてタグを除去し、その結果の文字列を戻り値として返します。これにより、入力データがHTMLとして誤って解釈されることを防ぎ、安全に表示できるようになります。
なお、もし「HTML特殊文字のエスケープ」を意図するキーワード「filter_sanitize_full_special_chars」の場合、PHPにはFILTER_SANITIZE_SPECIAL_CHARSという別のフィルターが存在します。こちらは「<」や「>」のような特殊文字を「<」や「>」のようなHTMLエンティティに変換しますが、FILTER_SANITIZE_STRIPPEDはタグそのものを削除するという点で機能が異なりますのでご注意ください。
FILTER_SANITIZE_STRIPPEDは、入力文字列からHTMLタグやPHPタグをすべて除去し、クロスサイトスクリプティング(XSS)攻撃などのリスクを低減するフィルターです。このフィルターはタグの除去に特化しており、特殊文字(<, >, &, ", 'など)をHTMLエンティティに変換する機能はありませんので、その違いを理解することが重要です。キーワードとして挙げられた「filter_sanitize_full_special_chars」がもし特殊文字のエスケープを意図する場合は、FILTER_SANITIZE_SPECIAL_CHARSやhtmlspecialchars関数のような別の手段が必要になります。サニタイズは不正なデータを無害化する目的で使われますが、入力値が期待通りの形式であるかを確認するバリデーションとは異なります。安全にコードを利用するためには、用途に応じてこれらを適切に組み合わせ、最終的にデータを表示する形式に合わせて適切なエスケープ処理を行うことを忘れないでください。