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

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

ただいまの
回答率

88.11%

$_POSTで送られた値は、全て文字列型として扱われるのでしょうか?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,653

score 58

POSTで送られた値は、全て文字列型として扱われるのでしょうか?

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

<form name="sample_form" action="#" method="post">
  <input type="text" name="sample_test">
  <input type="submit" name="sample_submit" value="検索">
</form>
<?php
if( isset($_POST['sample_submit']) ){
  $test = $_POST['sample_test'];
?>

上記の環境で、
$_POST['sample_test']の中身が、die("「HELLO」");
の場合、どうなるのだろうと思い実験したところ、何も起きませんでした。

die("「HELLO」");
がPHPとしてわたってきていたら、画面が白くなって「HELLO」と表示されると思うのですが、ならないということは、文字列として扱われているということなのでしょうか。

以前、何かの記事で、POSTの中身が「文字列であるか」を確認し、「文字列でない場合はエラーを返す」ようにしている記事を読んだ記憶があります。

しかし、PHPにおいて、POSTで送られた値が全て文字列型として扱われる仕様なのであれば、個人的に文字列型かどうかの検証はする必要がないと思うのですが、どうなのかなと不思議に思い、質問させて頂きます。

もしかして、$_POSTで送られてくる中身が文字列以外の例外的なケースなどもあるのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

$_POSTで送られた値は、全て文字列型として扱われるのでしょうか?

表現からして、少し勘違いがあるかと。
$_POST は、「Content-Type に application/x-www-form-urlencoded あるいは multipart/form-data を用いた HTTP リクエストで、 HTTP POST メソッドから現在のスクリプトに渡された変数の連想配列」です。 

つまり、$_POST は POST されたデータの中から特定の箇所をフォーマットに従い取り出した内容の格納先ということです。
で、その取り出しの際 $_POST に文字列(or 配列)として格納されるということです。

何かの記事で、POSTの中身が「文字列であるか」を確認し、「文字列でない場合はエラーを返す」ようにしている記事を読んだ記憶があります。

$_POST 以外の取り出し方法も php には用意されているので、方法によっては POST データそのものの中身の確認が必要です。ただ、使われる機会は限定的なので、そういった使用方法があることだけ知っていれば当面は不自由しないと思います。

余談

die("「HELLO」");
がPHPとしてわたってきていたら、画面が白くなって「HELLO」と表示されると思うのですが、ならないということは、文字列として扱われているということなのでしょうか。 

eval() に文字列を突っ込むことで実現します。
これは、$_POST が文字列であることとは無関係で、文字列を突っ込む先を間違うと危険ということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/03 16:32

    こんなにも詳しい、勉強になる回答を頂けて、本当に有難うございます。
    ものすごく参考になりました<(_ _)>
    もっともっと勉強します!

    キャンセル

+3

文字列扱いですよ。
勝手にPHPコードが実行されるような恐るべき仕様だったらdo{fopen('http://example.com')}while(1)のような文字列がPOSTされたら恐ろしいですよね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/03 11:21

    ですよね(><;)
    POSTされてくる中身を毎回文字列型かどうかチェックしていた方の記事を思い出し、急に心配になってしまいました、ありがとうございます!

    キャンセル

  • 2019/03/03 13:14 編集

    ちなみに、struts2(javaのoss)のライブラリのよくある不具合として

    postされたデータによってリモート上の意図しないコードが実行される

    というものがあったりするから過信はいけない。

    キャンセル

  • 2019/03/03 16:30

    そんなこともあるのですね。。用心のし過ぎはないということなのですね。。
    とても参考になりました、有難うございます<(_ _)>

    キャンセル

+3

POSTで送られた値は、全て文字列型として扱われるのでしょうか?

配列を送信することは可能です。

<input name="foo[]" value="a">
<input name="foo[]" value="b">

このようなフォームを送信すると、$_POST['foo']には['a', 'b']のような配列が入ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/03 13:02

    配列の可能性を見落としていました。
    ありがとうございます、本当にその通りですねm(_ _)m

    キャンセル

+2

POSTで送られた値は、全て文字列型として扱われるのでしょうか?

そのとおり、POSTやGETで送信されたものは文字列型になります。
var_dump関数でチェックしてみてください。
例えば

var_dump($_POST['example']);


stringという部分があれば文字列型です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/03 13:01

    おっしゃる通りでした、ありがとうございます!
    勉強になりましたm(_ _)m

    キャンセル

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る