[解決済み] FILTER_SANITIZE_STRINGって何するんですか?
質問
というような選択肢を説明する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
の代わりに空文字列を使用します。
関連
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】phpのシンタックスエラー、予期しないT_IFエラーを修正する方法は?[クローズド]。
-
[解決済み] "お知らせ 未定義変数"、"Notice: Notice: 未定義のインデックス", "Notice:未定義のインデックス", "Notice."。PHPを使用した「未定義のオフセット
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み] Long-Polling、Websocket、Server-Sent Events (SSE)、Cometとは何ですか?
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] PHPのキーワード'var'は何をするのですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】空の配列要素を削除する
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】In_arrayが動作しない。