web-dev-qa-db-ja.com

FILTER_SANITIZE_STRINGは何をしますか?

FILTER_FLAG_STRIP_LOWのようなオプションを説明する100万のQ&Aがありますが、FILTER_SANITIZE_STRINGはオプションなしで独自に何をしますか?タグをフィルタリングするだけですか?

39
user1322720

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;
    }
}

あなたが言ったように、フラグはすでにインターネット上で説明されているのでコメントフラグをスキップし、代わりにalwaysが実行されることに注目します。よく文書化されています。

最初-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を返します。
62
rr-

「タグの除去」が_<_ _>_文字だけを意味するのかどうか、またタグ間でコンテンツを保持するのかどうかはわかりませんでした。文字列「Hello!」 _<b>Hello!</b>_から、チェックすることにしました。以下は、PHP 7.1.5(およびコマンドラインのBash)を使用した結果です。

 curl --data-urlencode 'my-input ='\
 '1。 ASCII b/n 32および127:ABC abc 012 '\ 
' 2。ASCII 127より高い:Çüé '\ 
 '3。PHP tag:<?php $ i = 0;?>'\
 '4。HTMLタグ:<script type = "text/javascript"> var i = 0; </ script> '\ 
' 5。アンパサンド: '\ 
' 6。バックティック: `'\ 
' 7。二重引用符:" '\ 
 '8。単一引用符:' "'"\
 http://localhost/sanitize.php 
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;_
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '_
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;_
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_BACKTICK);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: 7. Double quote: &#34; 8. Single quote: &#39;_
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: &#195;&#135;&#195;&#188;&#195;&#169; 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;_
    • sanitize.php:<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_AMP);
    • 出力:_1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: &#38; 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;_

また、FILTER_FLAG_STRIP_LOW FILTER_FLAG_ENCODE_LOWフラグについては、Bashにこれらの文字が表示されないため、ベル文字(#7;、ASCII 007)およびRestman Chrome拡張機能:

  • これらのフラグのいずれも使用しない場合、文字は保持されます
  • fILTER_FLAG_STRIP_LOWで、削除されます
  • fILTER_FLAG_ENCODE_LOWでは、_&#7;_にエンコードされます
8
Jan Żankowski