質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3363閲覧

PHPのfilter関数の使い方とヌルバイト文字の除去について教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/04/04 06:51

filter関数のフィルタフラグに、コードが 32 未満の文字を除去する FILTER_FLAG_STRIP_LOW があります。

コードが 32 未満の文字というのは、ASCII文字コードを指しており、ヌルバイト文字も対象なのかと思います。

これを使うとヌルバイト文字の除去(ヌルバイト攻撃の対処)をできるのでは?とおもい、試していますが、うまく除去されません。

<!doctype html> <html> <head> <meta charset="utf-8"> <title>null</title> </head> <body> <form method="post" action="send.php"> <input type="text" name="name"> <input type="submit" value="送信"> </form> </body> </html>
<!doctype html> <html> <head> <meta charset="utf-8"> <title>null</title> </head> <body> <?php $name = filter_input(INPUT_POST, 'name'); echo $name; ?> </body> </html>

\0\00%00 などを入力してみましたが、そのまま表示されます。

除去されて何も表示されないと予想していました。

記述の仕方に問題があるのでしょうか?

そもそもに誤りがあり、filter関数を使うことで、ヌルバイト文字を除去することはできないのでしょうか?

ご存じの方、教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

フィルタを適用したい場合には、filter_inputの第3引数に、フィルターの種類を定数で指定する必要があります。そして、

省略した場合は FILTER_DEFAULT を使います。これは FILTER_UNSAFE_RAW と同等です。 結果的に、デフォルトでは何もフィルタリングをしません(PHPマニュアルより)。

投稿2017/04/04 06:57

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/04 08:10

ご回答ありがとうございます。 PHPマニュアルは確認しておりましたが、理解できていなかったようです^^; `FILTER_DEFAULT` は `FILTER_UNSAFE_RAW` のエイリアスとの記述があり、フラグの中に`FILTER_FLAG_STRIP_LOW` が含まれているのですが、省略(デフォルト)でコードが 32 未満の文字を除去されるのかと勘違いしておりました><
guest

0

filter_input(INPUT_POST, 'name'); のところは以下のように書けば動くと思います。

PHP

1filter_input(INPUT_POST, 'name', FILTER_DEFAULT, FILTER_FLAG_STRIP_LOW);

投稿2017/04/04 08:12

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/04 08:15

おお!徳丸先生だ! 回答ありがとうございます。 別の方のコメントにも記載しましたが、inputのフォームからヌルバイトを送って確認するという誤った方法をしていていたので、別々のやり方で試してみます。
guest

0

ベストアンサー

たとえばこんな感じ

PHP

1$str="test".chr(0).chr(10).chr(13)."test"; 2var_dump($str); 3var_dump(filter_var($str)); 4var_dump(filter_var($str,FILTER_SANITIZE_STRING)); 5var_dump(filter_var($str,FILTER_SANITIZE_STRING | FILTER_FLAG_STRIP_LOW )); 6 7$str="test".chr(0)."test"; 8var_dump(filter_var($str,FILTER_SANITIZE_STRING)); 9

投稿2017/04/04 07:18

yambejp

総合スコア114833

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/04 08:10

ご回答ありがとうございます。 コードを試してヌルバイトの除去を確認できました^^ ヌルバイト攻撃の対応を調べると、str_replace や preg_match を用いて除去したり、弾いたりする方法がありますが、値受け取るときにfilter_inputを使っているので、このときにヌルバイトを除去する方がよいのでは思い、調べたり、試したりしていました。 そもそもの、試し方にも問題があったようです>< POSTとGETで文字の受け渡しの違いがあるようで、POSTフォームで \0 と入力しても、ただの文字として扱わるようです... https://oshiete.goo.ne.jp/qa/5272513.html http://www.phppro.jp/qa/4462 POSTのときにはヌルバイトとして扱われないなら、そもそもヌルバイト攻撃自体が難しい気もしますが、まだまだ知識不足なので、調べてみようと思います。 ありがとうございました。
ockeghem

2017/04/04 08:13

POSTメソッドでもヌルバイトは送信可能ですよ
退会済みユーザー

退会済みユーザー

2017/04/04 08:17

えー?そうなんですか? 私の理解に誤りがあるんですね。 ちょっと調べてみます。 教えてくださり、ありがとうございます。
ockeghem

2017/04/04 08:21

自分で調べて分からなかったら、別の質問として投稿してくだされば…
退会済みユーザー

退会済みユーザー

2017/04/04 08:24

ありがとうございます。 そのときは、ご教示ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問