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

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

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

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

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

Q&A

解決済

2回答

1144閲覧

phpにおける定義済み関数eval()について

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

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

0グッド

0クリップ

投稿2020/07/12 05:32

よろしくお願いいたします。

環境: MacOS 10.15.4

PHPリファレンスを参考に関数について見ていると、eval()関数という関数が出てきたのですが、
説明を読むと

"eval — 文字列を PHP コードとして評価する"

と説明があり、自分の解釈ではphpタグ内でevalを使用するとカッコ内でphp開始タグと終了タグを生成
するという解釈をしているのですが.....

いくつか疑問点がありまして

1.そもそもなぜphpタグ内でさらにphp開始終了タグを生成する必要があるのか
2.リファレンスには不用意な使用は危険であるとあるがなぜか

1に関しては唯一使う可能性があるとしたら、phpタグをphpタグ内で抜けたい時に
eval('?> hoge <?php')のような形でhoge箇所にphpパーサを適用させたくない場合に使うのかなあ
と思ったのですが、そもそもhtmlはphpでもダブルクォートすれば使えるし、いまいち使用したい
場面が思いつきません。

2に関してはありうるとしたらデータを送られるformなどに意図的にphpを閉じるセキュリティ上の注意くらいしか思い浮かびませんでした。

実際にeval()を使用される方などはどのようなシチュエーションで使用されるのでしょうか。

アドバイスいただけますと幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

よくあるのは、変数を php として評価させたいときですね。
$str = "1+2+3"
を計算させるのはそれなりに大変(数式のパーサを作って、計算させないといけない)なんですけど、eval を使用すると簡単に結果を取り出せます。

で、この「変数を評価させる」てのが厄介で、攻撃者が危険なコードを実行できてしまうケースがあります。
初心者が最もやりがちなのは「外部からの入力を直接評価させる」ことです。
危険なサンプルはネット上に転がっているので、調べてみると良いです。

投稿2020/07/12 05:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/07/12 05:51

以前もご回答いただきまして、ご親切にありがとうございます。嬉しいです。 なるほどです。この”評価させたい”という意味合いは、phpパーサを適用させたいという解釈で良いのでしょうか... 自身の解釈としては eval(' xxx ')は"<?php xxx ?>" という解釈なのですが、いまいち的を得ていない気がします。 また、いまいち理解できていないのがご記載いただきました $str = "1+2+3" ですが、こちらはダブルクォートにて文字列認識が行われるところ、evalを使用すると、上記のphp処理がされるためintegerとして計算されるということでしたでしょうか。 phpタグ内で実行するとstring処理される気がしたのですが、すみません。まだ私が理解できていないみたいです。 自身でも調べてみたいと思います。
退会済みユーザー

退会済みユーザー

2020/07/12 06:11

すみません、勘違いしておりました。 文字列扱いされる表記である"1+2+3"がphp処理されるのでphp処理によりintegerとして扱われるという こと?みたいですね。 ご回答ありがとうございました。
guest

0

全然違います。

例えば'$a = 1;'という文字列があったときに、evalするとこれを実行すると言うことです。

危険なのは、外部からの入力データをそのままevalに渡す場合です。
例えば、'system("cat /etc/passwd");'という文字列が与えられたときに、それをevalするとユーザ名が流出します。

実際にeval()を使用される方などはどのようなシチュエーションで使用されるのでしょうか。

evalを使うべきところは普通は無いですね。
例えば、電卓プログラムを安易に作りたいというケースとか。"1+3"という文字列から4を得るにはevalします。

PHP

1$input = "1+3"; 2eval("$a=$input;"); 3echo $a;

投稿2020/07/12 05:50

otn

総合スコア84557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問