1. ホーム
  2. php

[解決済み] FILTER_SANITIZE_STRINGって何するんですか?

2022-02-06 06:21:46

質問

というような選択肢を説明するQ&Aは山ほどあります。 FILTER_FLAG_STRIP_LOW とはいえ FILTER_SANITIZE_STRING は、何もオプションを付けずに単独で動作するのでしょうか?タグをフィルタリングするだけなのでしょうか?

解決方法は?

によると PHPマニュアル :

タグを除去し、オプションで特殊文字を除去またはエンコードする。

によると W3Schools :

The FILTER_SANITIZE_STRING は、不要な文字を除去したり、エンコードしたりします。

このフィルタは、アプリケーションにとって有害となりうるデータを削除します。タグを除去したり、不要な文字を削除したり、エンコードしたりするために使用されます。

さて、これだけではよくわかりませんね。PHPのソースを見に行ってみましょう。

ext/filter/filter.c :

static const filter_list_entry filter_list[] = {                                       
    /*...*/
    { "string",          FILTER_SANITIZE_STRING,        php_filter_string          },  
    { "stripped",        FILTER_SANITIZE_STRING,        php_filter_string          },  
    { "encoded",         FILTER_SANITIZE_ENCODED,       php_filter_encoded         },  
    /*...*/

では、次に php_filter_string が定義されています。
ext/filter/sanitizing_filters.c :

/* {{{ php_filter_string */
void php_filter_string(PHP_INPUT_FILTER_PARAM_DECL)
{
    size_t new_len;
    unsigned char enc[256] = {0};

    /* strip high/strip low ( see flags )*/
    php_filter_strip(value, flags);

    if (!(flags & FILTER_FLAG_NO_ENCODE_QUOTES)) {
        enc['\''] = enc['"'] = 1;
    }
    if (flags & FILTER_FLAG_ENCODE_AMP) {
        enc['&'] = 1;
    }
    if (flags & FILTER_FLAG_ENCODE_LOW) {
        memset(enc, 1, 32);
    }
    if (flags & FILTER_FLAG_ENCODE_HIGH) {
        memset(enc + 127, 1, sizeof(enc) - 127);
    }

    php_filter_encode_html(value, enc);

    /* strip tags, implicitly also removes \0 chars */
    new_len = php_strip_tags_ex(Z_STRVAL_P(value), Z_STRLEN_P(value), NULL, NULL, 0, 1);
    Z_STRLEN_P(value) = new_len;

    if (new_len == 0) {
        zval_dtor(value);
        if (flags & FILTER_FLAG_EMPTY_STRING_NULL) {
            ZVAL_NULL(value);
        } else {
            ZVAL_EMPTY_STRING(value);
        }
        return;
    }
}

フラグについては、おっしゃるとおりネットですでに説明されているのでコメントを省略し、何がどうなっているかに注目します。 常に が代わりに実行されますが、これはあまり文書化されていません。

最初の php_filter_strip . この関数に渡されたフラグを受け取り、それに応じて処理するだけで、大したことはしていません。これは文書化されていることを行うものです。

次に、ある種のマップを構築し php_filter_encode_html . もっと面白いのは、以下のようなものを変換してくれることだ。 " , ' , & と、ASCII コードが 32 よりも小さく 127 よりも大きい文字を HTML 実体に変換します。 & という文字列になります。 & . ここでもフラグが使われています。

次に php_strip_tags_ex で定義されているように)HTML、XML、PHP タグを除去します。 /ext/standard/string.c ) と、コメントにあるようにNULLバイトを削除します。

それに続くコードは、内部の文字列管理に使われるもので、実際には何のサニタイズも行いません。正確には、文書化されていないフラグである FILTER_FLAG_EMPTY_STRING_NULL を返します。 NULL は、サニタイズされた文字列が空の場合、単に空の文字列を返す代わりに、実際にはそれほど有用ではありません。例を挙げます。

var_dump(filter_var("yo", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL));
var_dump(filter_var("\0", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL));
var_dump(filter_var("yo", FILTER_SANITIZE_STRING));
var_dump(filter_var("\0", FILTER_SANITIZE_STRING));

string(2) "yo"
NULL
string(2) "yo"
string(0) ""

それ以上のことはないので、マニュアルはかなり正しかったということになりますね--総括すると。

  • 常に:HTML、XML、PHPタグを除去し、NULLバイトを除去します。
  • FILTER_FLAG_NO_ENCODE_QUOTES - このフラグは引用符をエンコードしません。
  • FILTER_FLAG_STRIP_LOW - ASCII 値が 32 未満の文字を削除します。
  • FILTER_FLAG_STRIP_HIGH - ASCII値が127以上の文字を削除します。
  • FILTER_FLAG_ENCODE_LOW - ASCII 値が 32 未満の文字をエンコードする。
  • FILTER_FLAG_ENCODE_HIGH - ASCII値が127以上の文字をエンコードする。
  • FILTER_FLAG_ENCODE_AMP - をエンコードして、& 文字を & (ただし & ).
  • FILTER_FLAG_EMPTY_STRING_NULL - 戻る NULL の代わりに空文字列を使用します。