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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

1回答

4264閲覧

nullバイト対策でpreg_matchを使用した時に「\0」にマッチしない

veneno

総合スコア15

PHP

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

0グッド

1クリップ

投稿2018/11/01 14:13

前提・実現したいこと

お問い合わせフォームを作っています。
nullバイト対策で意図した動作が出来ずに困っています。

フォームからはPOSTでデータを送信しているのですがテストに「名無し\0」と入力して送信してもpreg_matchでで"\0"にマッチしません。
「\0」が入っているにも関わらず常に「正しい値です」が表示されてしまうのです。

「str_replace」でサニタイジングしている例がよく書かれていますができれば入力自体が不正としてエラー表示を出したいのです。
いろいろ試したり調べたりしてみましたが原因がわかりませんでした。

お詳しい方々のアドバイスなど頂けると幸いです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

preg_matchで"\0"にマッチしない

該当のソースコード

var_dump($_POST); foreach($_POST as $key => $val){ $pattern_null = '/\0/'; if(preg_match($pattern_null, $val)){ die('不正な入力です。'); }else{ die('正しい値です'); } } var_dumpしたときの$_POSTの値 array(5) { ["name1"]=> string(11) "名無し\0" ["name2"]=> string(9) "権兵衛" ["kana1"]=> string(9) "ナナシ" ["kana2"]=> string(12) "ゴンベエ" ["sendform"]=> string(15) "確認画面へ" }

試したこと

直接コード内に"名無し\0"と書いた場合にはマッチしました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

データに入っているのは「ヌル文字」"\0"じゃなくて、「バックスラッシュゼロ」"\0"のようですよ。

ヌル文字を送るには、おそらく、HTML画面から文字を入れるんじゃなくて、プログラムで送信する必要があると思いますが、そうしていますか?

投稿2018/11/01 14:25

編集2018/11/01 14:45
otn

総合スコア84538

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

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

veneno

2018/11/01 14:58

ご回答ありがとうございます。 テストはフォームからの入力でしかしていないです。 自前でフォームを作るのは初めてなのですがフォームからの場合は"\0"と入力しても"\0"になってしまうのでしょうか?
otn

2018/11/02 02:42

フォームから入力できるのは、「バックスラッシュゼロ」で、それはPHPプログラム内では"\0"と表記します。 ブラウザからの入力だけでは、ヌル文字のテストは出来ないと思います。 と思ったけど、開発者ツールを使えば出来ますね。 JavaScriptを使って、inputタグのvalueを書き換えて送信するとヌル文字も送れました。
ockeghem

2018/11/02 03:37

POSTではなくGETにして、ヌル文字は%00で指定するのが簡便かと思います
otn

2018/11/02 03:56

> POSTではなくGETにして、 なるほど!
veneno

2018/11/03 06:47

otnさん、ockeghemさんありがとうございます。 >フォームから入力できるのは、「バックスラッシュゼロ」で、それはPHPプログラム内では"\0"と表記します。 ということはvar_dumpで"名無し\0"と表示されていても実際には「名無し\0」とプログラム側は認識しているということなのでしょうか? 確認にはChromeのデベロッパーツールを使っています。 >POSTではなくGETにして、ヌル文字は%00で指定する というのはformタグのmethodを「GET」にして「名無し\n」を「名無し%00」に書き換えてテストするということでよろしいでしょうか?
ockeghem

2018/11/03 07:34

『ormタグのmethodを「GET」にして「名無し\n」を「名無し%00」に書き換えてテストするということでよろしいでしょうか?』<はい。いったん送信ボタンを押してヌル文字なしの結果が表示されますが、その後アドレスバー上で %00 を追加する操作になります。
veneno

2018/11/05 14:04

ockeghemさん、わかりやすいアドバイスありがとうございます。 おかげで、うまくいきました。 今回は、otnさん、ockeghemさんのアドバイスでvar_dumpで表示されたものと実際にプログラム側が認識している値に違いがあることがわかりましたが、フォームからの入力以外で同じようなケースに遭遇した場合にはどう変数内の値を確認したらよいのでしょうか?
otn

2018/11/05 15:19

var_dump()でなく、var_export()でしょうか。
otn

2018/11/05 15:30

↑だめだ。\0 は表示してくれるけど、全てのコントロールコードを見えるようにはしてくれない。
ockeghem

2018/11/06 11:33

僕は echo bin2hex(式); を使っていますね
veneno

2018/11/07 14:29

otnさん、ockeghemさんありがとうございます。 var_dump()、var_export()、echo bin2hex(式) それぞれ使ってみましたが一長一短ありますね。 どれか一つで不可視文字などもきちんと表示してくれるものがあると助かるのですが確認したい内容に合わせて使い分けるしかなさそうです。 でも、初心者向けのページではecho、print_r、var_dumpしか出てこなかったので確認する方法が広がったのは今後の助けになります。 お二人には感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問