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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

セキュリティー

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

PHP

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

Q&A

解決済

4回答

14254閲覧

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

yayak

総合スコア66

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

セキュリティー

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

PHP

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

0グッド

0クリップ

投稿2019/03/03 02:10

編集2019/03/03 02:14

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で送られてくる中身が文字列以外の例外的なケースなどもあるのでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

$_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 04:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yayak

2019/03/03 07:32

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

0

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

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

php

1var_dump($_POST['example']);

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

投稿2019/03/03 03:11

fuji_0055

総合スコア163

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

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

yayak

2019/03/03 04:01

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

0

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

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

html

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

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

投稿2019/03/03 02:47

maisumakun

総合スコア145183

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

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

yayak

2019/03/03 04:02

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

0

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

投稿2019/03/03 02:17

kunai

総合スコア5405

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

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

yayak

2019/03/03 02:21

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

退会済みユーザー

2019/03/03 04:15 編集

ちなみに、struts2(javaのoss)のライブラリのよくある不具合として postされたデータによってリモート上の意図しないコードが実行される というものがあったりするから過信はいけない。
yayak

2019/03/03 07:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問