Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】FILTER_FLAG_STRIP_HIGH定数の使い方

FILTER_FLAG_STRIP_HIGH定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FILTER_FLAG_STRIP_HIGH定数は、入力データから予期しない高位ASCII文字を取り除くためのフラグを表す定数です。

この定数は、PHPのfilter_var()関数などのサニタイズ(安全な形式に整形する処理)フィルターと組み合わせて使用されます。具体的な役割は、入力文字列に含まれるASCII文字セットの範囲外の文字、つまり文字コードが127より大きい文字(拡張ASCII文字や一部の特殊文字など)を、指定された値から削除することです。

主な利用目的は、Webフォームからのユーザー入力や外部システムからのデータなど、信頼できない情報源からの入力値を安全に処理することにあります。例えば、データベースに格納する前に、予期せぬ特殊文字や制御文字を除去することで、データの整合性を保ち、アプリケーションの安定性を確保できます。これにより、文字化けや、システムが想定しない文字が原因で発生するエラーを防ぐことができます。

特に、特定の文字エンコーディングのみを許容するシステムや、厳密なデータ形式が求められる場面で、不要な文字の混入を防ぎ、セキュリティとデータの品質を向上させるために役立つ定数です。

構文(syntax)

1<?php
2filter_var('文字列', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

FILTER_FLAG_STRIP_HIGH は、文字列からASCIIコード127以上の文字を取り除くための定数です。この定数は、filter_var 関数や filter_input 関数で使用され、サニタイズ処理のオプションとして機能します。

サンプルコード

PHP FILTER_FLAG_STRIP_HIGH で高位ビット文字を除去する

1<?php
2
3/**
4 * FILTER_FLAG_STRIP_HIGH を使用して文字列から高位ビット文字を除去するサンプル
5 *
6 * この関数は、入力文字列からASCIIコード127より大きい文字(高位ビット文字)を
7 * 削除した新しい文字列を返します。主にユーザー入力のサニタイズに利用されます。
8 *
9 * @param string $input 処理する文字列
10 * @return string 高位ビット文字が削除された文字列
11 */
12function sanitizeStringStripHigh(string $input): string
13{
14    // filter_var 関数と FILTER_UNSAFE_RAW フィルタを使用して文字列をサニタイズします。
15    // FILTER_FLAG_STRIP_HIGH フラグは、ASCIIコード127より大きい文字を除去するように指示します。
16    // FILTER_UNSAFE_RAW は、基本的には何もせず値をそのまま返すフィルタですが、
17    // フラグと組み合わせることで特定の変換を適用できます。
18    $sanitized = filter_var(
19        $input,
20        FILTER_UNSAFE_RAW, // 生の文字列として扱い、フラグによって挙動を変更
21        FILTER_FLAG_STRIP_HIGH // ASCIIコード127より大きい文字を除去するフラグ
22    );
23
24    return $sanitized;
25}
26
27// サンプル使用例
28
29// 高位ビット文字(例: 日本語文字、絵文字など)を含む文字列
30$originalString = "Hello, world! こんにちは 😄 This is a test string.";
31echo "元の文字列: " . $originalString . PHP_EOL;
32
33// 文字列から高位ビット文字を除去して表示
34$strippedString = sanitizeStringStripHigh($originalString);
35echo "除去後の文字列: " . $strippedString . PHP_EOL;
36
37// 別の例: ASCII文字のみの文字列
38$asciiOnlyString = "Hello, ASCII World!";
39echo "元のASCII文字列: " . $asciiOnlyString . PHP_EOL;
40$strippedAsciiString = sanitizeStringStripHigh($asciiOnlyString);
41echo "除去後のASCII文字列: " . $strippedAsciiString . PHP_EOL;
42
43?>

このサンプルコードは、PHPのFILTER_FLAG_STRIP_HIGH定数を利用して、文字列から特定の文字を除去する方法を示しています。FILTER_FLAG_STRIP_HIGHは、文字列処理において、ASCIIコード127を超える文字(高位ビット文字)を削除するように指示するためのフラグです。日本語文字や絵文字などがこれに該当します。

sanitizeStringStripHigh関数は、引数として受け取った$input文字列からこれらの高位ビット文字を除去し、その結果を新しい文字列として返します。関数内部ではPHPのfilter_var関数が使用されており、入力文字列のサニタイズを行います。filter_varの第2引数に指定されているFILTER_UNSAFE_RAWは、本来は入力値をそのまま返すフィルタですが、第3引数でFILTER_FLAG_STRIP_HIGHフラグを組み合わせることで、高位ビット文字の除去という特定の変換処理を適用しています。これにより、ユーザー入力などから不要な文字を効率的に取り除くことができます。

この関数の引数$inputには、処理対象となる元の文字列を渡します。戻り値は、高位ビット文字がすべて削除された、サニタイズ済みの新しい文字列です。この機能は、外部からの入力データに予期しない文字が含まれる可能性がある場合に、データの整合性を保ち、セキュリティ上のリスクを低減するために役立ちます。例えば、データベースへ保存する前に特定の文字を除去する際などに利用されます。

FILTER_FLAG_STRIP_HIGHは、日本語や絵文字など、ASCIIコード127より大きい文字をすべて除去するフラグです。このため、多言語対応のシステムや、全角文字を期待する入力に対して安易に適用すると、重要な情報が失われたり、文字化けが発生したりする危険性がありますので、使用には十分な注意が必要です。このフラグは主に、半角英数字のみを想定した入力に対し、予期せぬ高位ビット文字が混入した場合のデータ整形に利用されます。

これは入力データのサニタイズの一種ですが、クロスサイトスクリプティング(XSS)やSQLインジェクションといった一般的なセキュリティ脆弱性への直接的な対策にはなりません。データの完全性を損なわないよう、アプリケーションの要件をよく理解し、必要な文字が除去されないかを慎重に検討した上で利用してください。より堅牢な入力値処理のためには、バリデーションと組み合わせたり、適切な文字エンコーディング処理を施したりすることが重要です。

PHPで低位・高位ASCII文字を削除する

1<?php
2
3/**
4 * 文字列から低位ASCII文字と高位ASCII文字を削除(サニタイズ)する関数。
5 *
6 * この関数は filter_var() 関数と組み合わせて、FILTER_FLAG_STRIP_HIGH および
7 * FILTER_FLAG_STRIP_LOW 定数を利用して、特定のASCII範囲の文字を除去します。
8 *
9 * - FILTER_FLAG_STRIP_HIGH: ASCII値 128-255 の文字(例: 拡張ラテン文字の一部、特定の記号など)を削除します。
10 * - FILTER_FLAG_STRIP_LOW: ASCII値 0-31 の文字(例: 制御文字、NULL文字など)を削除します。
11 *
12 * これらのフラグは、ユーザー入力から意図しない文字や表示されない文字、
13 * あるいは潜在的に問題のある文字を除去したい場合に特に役立ちます。
14 *
15 * @param string $inputString サニタイズする元の文字列。
16 * @return string 指定されたASCII範囲の文字が削除されたサニタイズ後の文字列。
17 */
18function sanitizeStringStripHighAndLow(string $inputString): string
19{
20    // 削除したい文字の範囲を指定するフラグを組み合わせます。
21    // ビットOR演算子(|)を使用することで、複数のフラグを同時に適用できます。
22    $flags = FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW;
23
24    // filter_var 関数を使って文字列をサニタイズします。
25    // FILTER_UNSAFE_RAW は、基本的には文字列を変更しないフィルターですが、
26    // 'flags' オプションと組み合わせることで、指定されたフラグに基づいて
27    // 文字の削除などの処理を実行させることができます。
28    $sanitizedString = filter_var(
29        $inputString,
30        FILTER_UNSAFE_RAW,
31        ['flags' => $flags]
32    );
33
34    return $sanitizedString;
35}
36
37// --- サンプル使用例 ---
38
39// テスト用の文字列を準備します。
40// - \x00 (NULL), \x1f (Unit Separator): 低位ASCII文字 (0-31)
41// - \x7F (DEL): ASCII値 127 なので、削除対象外
42// - \x80 (PAD), \xFF (ÿ), \x9D (OSC): 高位ASCII文字 (128-255)
43// - 'é' は UTF-8 ではマルチバイト文字 (C3 A9) ですが、これらのバイトも高位ASCII範囲にあるため削除されます。
44$originalString = "こんにちは\x00世界\x1f!\x7FPHP\x80テスト\xFFデータ\x9Dとéです。";
45
46echo "元の文字列: " . $originalString . PHP_EOL;
47
48// 関数を呼び出して文字列をサニタイズします。
49$cleanedString = sanitizeStringStripHighAndLow($originalString);
50
51echo "サニタイズ後の文字列: " . $cleanedString . PHP_EOL;
52
53// この例での期待される出力:
54// "こんにちは世界!PHPテストデータとです。"
55// \x00, \x1f, \x80, \xFF, \x9D, および 'é' (UTF-8バイト C3 A9) が削除されます。
56// \x7F は ASCII値 127 のため保持されます。

このPHPサンプルコードは、入力された文字列から低位ASCII文字と高位ASCII文字を削除し、文字列を安全な状態に整える(サニタイズする)ための関数sanitizeStringStripHighAndLowの利用方法を示しています。これは、ユーザーからの入力データに予期せぬ文字やセキュリティ上の問題を引き起こす可能性のある文字が含まれていないかを確認する際に役立ちます。

サニタイズには、PHPのfilter_var()関数と、特定の文字範囲を指定するフラグ定数が使われます。FILTER_FLAG_STRIP_HIGHは、ASCII値128から255までの高位ASCII文字を削除する指示です。これには、拡張ラテン文字の一部や特定の記号などが含まれます。一方、FILTER_FLAG_STRIP_LOWは、ASCII値0から31までの低位ASCII文字(制御文字やNULL文字など)を削除します。これらのフラグは、ビットOR演算子|を使って組み合わせることで、同時に適用できます。

filter_var()関数は、FILTER_UNSAFE_RAWというフィルタータイプと共に、これらのフラグをオプションとして受け取ります。FILTER_UNSAFE_RAWは通常、文字列の内容をそのまま保持しますが、flagsオプションと組み合わせることで、指定されたASCII範囲の文字を取り除く処理を実行します。

sanitizeStringStripHighAndLow関数は、サニタイズしたい文字列を引数$inputStringとして受け取り、低位および高位ASCII文字が除去された新たな文字列を戻り値として返します。例えば、「こんにちは\x00世界\x1f!PHP\x80テスト\xFFデータ\x9Dとéです。」という文字列は、この処理によって「こんにちは世界!PHPテストデータとです。」のように、不要な文字が取り除かれた状態になります。これにより、アプリケーションのデータの整合性とセキュリティを向上させることができます。

このサンプルコードは、文字列から制御文字や特定の範囲のASCII文字を除去し、安全なデータに加工する目的で利用します。特に注意すべき点は、日本語などのマルチバイト文字を扱う場合です。UTF-8のようなエンコーディングでは、文字を構成するバイトが高位ASCII(128-255)の範囲に該当することがあり、その結果、意図せず文字全体が削除されてしまう可能性があります。そのため、このフィルターを使用する際は、処理対象となる文字列の文字エンコーディングと含まれる文字の種類を十分に確認し、必要な文字まで削除されないか慎重に検討してください。また、この処理はサニタイズの一環ですが、クロスサイトスクリプティング(XSS)などのあらゆるセキュリティ脆弱性を防ぐものではありません。アプリケーション全体のセキュリティ対策の一部として、他の適切な検証やエスケープ処理と組み合わせて利用することが重要です。重要なデータが欠損する可能性もあるため、適用前にデータの完全性を保てるか必ず確認しましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語