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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1934閲覧

PHP 安全な<input>や<textarea>の受け取り方について

gsuisk

総合スコア72

セキュリティー

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

4クリップ

投稿2017/11/20 12:02

PHPで <input type="text"><textarea> の受け取り方で最も良い方法はどのようなものでしょうか?

入門書を見ても統一されてなくてどれがベストなのかわかりません。

例えば以下のようなフォームがあったとします。

HTML

1 <form action="accept.php" method="post"> 2 3 苗字: 4 <input type="text" name="lName" size="25" maxlength="15" required> 5 6 名前: 7 <input type="text" name="fName" size="25" maxlength="15" required> 8 9 題名: 10 <input type="text" name="subject" maxlength="30" size="30"> 11 12 コメント: 13 <textarea name="comment" cols="30" rows="7" maxlength="200" required></textarea> 14 15 <input type="submit" value="送信"> 16 17</form> 18

これを受け取るPHPコードは以下です。(※CSRF対策はしていません)

PHP

1$errors = []; 2 3$space=[" ", " "]; //半角と全角スペース 4 5//苗字と名前(必須) 6if (($_POST["fName"]==="")||($_POST["lName"]==="")){ 7 $errors[] = "空です。"; 8}else { 9 $fName = $_POST["fName"]; 10 $fName = mb_substr($fName, 0, 15); 11 $fName = str_replace($space, "", $fName); 12 $fName = trim(mb_convert_kana($fName, "s", 'UTF-8')); 13 14 $lName = $_POST["lName"]; 15 $lName = mb_substr($lName, 0, 15); 16 $lName = str_replace($space, "", $lName); 17 $lName = trim(mb_convert_kana($lName, "s", 'UTF-8')); 18} 19 20//題名 21if (isset($_POST["subject"])){ 22 $subject = $_POST["subject"]; 23 $sybject = trim(mb_convert_kana($subject, "s", 'UTF-8')); 24 $subject = strip_tags($subject); 25 $subject = mb_substr($subject, 0, 30); 26} else { 27 $subject = ""; 28} 29 30//コメント(必須) 31if (isset($_POST["comment"])){ 32 $comment = $_POST["comment"]; 33 $comment = trim(mb_convert_kana($comment, "s", 'UTF-8')); 34 $comment = strip_tags($comment); 35 $comment = mb_substr($comment, 0, 200); 36} else { 37 $comment = ""; 38 $errors[] = "空です。"; 39} 40

一応、出力のコードも記載します。

PHP

1//エラーがあったとき 2if (count($errors) > 0){ 3 foreach ($errors as $value) { 4 echo $value; 5 } 6 exit(); 7}else { 8 //h()はHTMLエスケープ関数 9 echo h($fName); 10 echo h($lName); 11 echo h($subject); 12 echo h($comment); 13}

入力値チェックの後にやっていることはほとんど同じですが、

題名subject(必須でない)については、変数がセットされてない、又はそれがNULLであれば空文字に置き換えるという処理をしています。入力値がNULLになるときはあるのかわかりませんが...

入門書を読むと、フォーム値の受け取りで if($_POST["fName"]==="")のように空でないかチェックしていたり、issetやemptyを使っていたりします。

安全面も考慮すると、初めの入力値チェックはどのように行うのがよいのでしょうか?if else の構成はどのようにすべきですか?また必須項目でなくてもNULLはエラー対象にするべきでしょうか?

入力値チェックの後、文字数制限をしてスペースを取り除いてよい場合は上記の方法で問題ないでしょうか?

ご回答よろしくお願いします。

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

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

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

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

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

kei344

2017/11/22 18:11

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況を質問文に追記ください。
gsuisk

2017/11/23 14:27

ご指摘ありがとうございます。ご回答下さったお二人のどちらもベストアンサーにしたいところですが、先に回答下さった方をベストアンサーにさせていただきます。
guest

回答2

0

ベストアンサー

filter_inputとかどうでしょう。あと、下記記事が詳しいのでお勧めです。

【$_GET, $_POSTなどを受け取る際の処理 - Qiita】
https://qiita.com/mpyw/items/2f9955db1c02eeef43ea

【PHP: filter_input - Manual】
http://php.net/manual/ja/function.filter-input.php

投稿2017/11/20 12:05

kei344

総合スコア69366

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

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

gsuisk

2017/11/21 13:56

ありがとうございます。リンクの記事を読みました。filter_inputを使うのがよさそうですね。 (1) $name = (string)filter_input(INPUT_POST, 'name');  (2) $name = isset($_POST['name']) && is_string($_POST['name']) ? $_POST['name'] : ''; が等価な処理と書いてあるのですが、ポストされた値がNULLの時、(2)では空文字を$nameに代入しているのに対して(1)ではフィルタリングに失敗してFALSEが$nameに代入される。という違いがありますよね? そうすると(1)ではエラーが発生し(2)はプログラムが続行されるということになりますか?
gsuisk

2017/11/21 16:07

「NULL は常に空文字列に変換されます。」とありますね。 わかりました。ありがとうございました。
guest

0

安全面も考慮すると、初めの入力値チェックはどのように行うのがよいのでしょうか?if else の構成はどのようにすべきですか?また必須項目でなくてもNULLはエラー対象にするべきでしょうか?

要件によるので普遍的な回答はありません。

が、個人的に参考にしているのは、以下の記事です。
$_GET, $_POSTなどを受け取る際の処理

よくまとめてくれていると思います。

各種フレームワークの入力値チェック方法も読めるようであれば、読んでみると良いと思います。

追記
kei344 さんの回答と同じだったので、追加情報です!w
IDE 使ってると、$str = $_POST['str'];みたいな記述は警告をくらう事があります。
以下を参考にしてみてください。
スーパーグローバル変数に直接アクセスしない方がいい理由

投稿2017/11/20 12:08

編集2017/11/20 12:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gsuisk

2017/11/21 14:02

ご回答ありがとうございます。追加情報も拝見いたしました。 入力値チェックについては以下のようにfilter_inputを利用しようと思います。 $name = (string)filter_input(INPUT_POST, 'name'); 上に記載した文字数チェックについては問題ないと言えるでしょうか?もしよろしければアドバイス頂きたいです。
退会済みユーザー

退会済みユーザー

2017/11/21 14:39

マルチバイトの文字数チェックは目的によるのでなんとも。。。 スマートにやるなら、filter_input で FILTER_VALIDATE_REGEXP とかな気がします。
gsuisk

2017/11/21 16:15

正規表現で文字数を限定するということですね。 文字列中のスペースや前後のスペースを除去するのは目的によると思うのですが、 strip_tags()は正直必要ないですよね?入門書に書いてあったので一応使ったのですが、、、
退会済みユーザー

退会済みユーザー

2017/11/21 22:01

subject と comment に入っているので、掲示板等で装飾を排除する目的なんだと思います。レイアウト崩れを防ぐ目的で入れて運用しているところは多いと思いますよ。
gsuisk

2017/11/22 08:43

そういう目的で用いられるのですね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問