PHP初心者のためのフォームで動的な画像表示

このQ&Aのポイント
  • フォームの内容にしたがって画像を動的に出力する方法を学びます。
  • セキュリティを考慮し、POST送信による動的な画像表示の方法を理解しましょう。
  • 初心者にもわかりやすいコード例を交えて解説します。
回答を見る
  • ベストアンサー

フォームの内容にしたがって画像を動的に出力

PHP初心者です。 ファイルはメインページのaaa.phpとグラフを出力するbargraph.php(JpGraphのサンプル)からなり、 aaa.phpはセレクトボックス(A~E)、送信ボタン、画像だけで構成されるものとします。 A~Eを選択して送信ボタンを押すとPOST送信で自分自身aaa.phpが返り それに従って表示されている画像(グラフ)が変化するというものを作りました。 画像の部分は <?php print "<img src='bargraph.php?a=" ?> <?php print $_POST['select_name1']; ?> <?php print "'>"; ?> このように選択された値を bargraph.phpが$_GETで受け取ってそれに従って表示してます。 セキュリティのことを考えてそれを POST送信にして同じような事をやりたいのですが、 今度はURLに文字を載せられないのでやり方がわかりません。 どうしたら良いでしょうか? 初心者なので問題の部分以外の部分でとんちんかんな事をしてたら それも指摘してもらえると幸いです。お願いします。

  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

>> そもそも<img>としてbargraph.phpを表示させるやり方は問題ない・・・というか普通ですか?  非常によくある手法です。プログラマ側としては一番実装がラクになります。但し、アクセスの集中するサイトである場合、前の解答で述べたようにテンポラリファイルを生成したほうが負荷を緩和できたりすることも考えられます。 >> GET送信=よくないっていう偏見とURLの後ろにくっつけるのが綺麗じゃないと思っていたのでこういった質問になってしまいました。  FirefoxのLiveHTTPHeaderなどのアドオンを利用すれば、ノンプログラマな一般人の人でも任意のPOSTリクエストを送信出来てしまうため、GETであろうとPOSTであろうと入力の妥当性を検証すべきことには変わりありません。  確かにファイルの後ろにクエリを付加することは汚いように思うかもしれませんが、画像ファイルとして参照するだけならばこれでも問題はないでしょう。そこまで気にするならばそもそも画像を出力するファイルの拡張子を(見た目上)PHPから他に変更することから始まると思います。

cern5100
質問者

お礼

回答ありがとうございます。 聞きたいことがよくわかりました。 サイトの規模的にも今の方法に 最初に教えてもらったURLエンコードでいきたいと思います。 ありがとうございました。

その他の回答 (2)

noname#244856
noname#244856
回答No.2

結論から言うと、「bargraph.phpを画像として扱わせる」既存のソースコードでは実現できません。テンポラリファイルを生成するための書き換えが必要になり、一定時間経過したら削除する等のことも考えて手間が増えます。 「セキュリティのことを考えて」とありますが、これを表示させることでどんな脆弱性が発生するかどうかを十分に調べた上でのご質問でしょうか?XSS脆弱性を防ぐだけでは不十分ですか?

cern5100
質問者

補足

再びありがとうございます。 そういうやり方はできないんですね。 一般的にどういう方法をとるのが普通なのかわからなかったので GET送信=よくない っていう偏見とURLの後ろにくっつけるのが綺麗じゃないと 思っていたのでこういった質問になってしまいました。 そもそも<img>としてbargraph.phpを表示させるやり方は問題ない ・・・というか普通ですか? 表示させるグラフ部分を直接同じファイルのソースに書き込むべきですか? たびたびすみませんお願いします。

noname#244856
noname#244856
回答No.1

URLエンコードすればXSS脆弱性は無くなります。手抜きでいいなら <img src="bargraph.php?a=<?=@urlencode($_POST['select_name1'])?>"> エラーも厳密に防ぎたいならば <?php $k = 'select_name1'; $a = isset($_POST[$k]) && is_string($_POST[$k]) ? $_POST[$k] : ''; $a = urlencode($a); ?> <img src="bargraph.php?a=<?=$a?>">

cern5100
質問者

補足

回答ありがとうございます。 勉強になります。 URLの後ろに乗せない方法で画像を動的に表示したいです。

関連するQ&A

  • フォーム送信後の更新ボタンでも$_POST変数が初期化されない

    フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。 ブラウザの更新ボタンを押したときには、ポストせずにフォームをクリアしたいのですが、どうすればできますでしょうか? <form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>"> <input type=text name=aaa> <input type="submit" name="submit" value="submit"> </form> <?php if($_POST['submit']) { 処理 } ?>

    • ベストアンサー
    • PHP
  • PHPでフォームからURLへの値の受け渡し

    選択された値をURLとして移動させたいと考えています。 例えば、http://example.com/というページにフォームを設置し、 ドロップダウンメニューから四国を選択すると http://example.com/shikoku/というページが表示されるといった具合です。 他のページを参考しつつ自分で考えてみたのですが、2度送信ボタンを押さなければページが表示されません。 最近になってPHPを触りはじめたので、いまいち何がおかしいのかわからず困っています…。 どなたかご教授お願いします。また、変な部分もあるかと思いますので、よろしければ教えてください。 <?php if($_POST['submit']) {$url = $_POST['tiiki']."/".$_POST['ken'] ;}?> <form action="<?php echo $url ;?>" method="post"> <select name="tiiki"> <?php $tiiki = array("kyusyu"=>"九州","shikoku"=>"四国");?> <?php foreach ( $tiiki as $tiiki1=>$tiiki2 ){?> <option value="<?php echo $tiiki1 ;?>"><?php echo $tiiki2 ;?></option> <?php };?> </select><br /> <select name="ken"> <?php $ken = array("fukuoka"=>"福岡","ehime"=>"愛媛");?> <?php foreach ( $ken as $ken1=>$ken2 ){?> <option value="<?php echo $ken1 ;?>"><?php echo $ken2 ;?></option> <?php };?> </select><br /> <input type="submit" name="submit" value="送信"> </form>

    • ベストアンサー
    • PHP
  • <a href='aaa.php'>で、post形式で渡したい

    index.phpのformタグで、post形式でaaa.phpに送信したとします。 aaa.phpで表示した画面でたとえば <a href='aaa.php?kategori=$_POST[kategori]&kazu=$_POST[kazu]'>テスト</a> と出力するようにしたとすると、aaa.phpには「get」方式で渡されると思いますが、これをpost形式で渡すことはできるのでしょうか?

    • ベストアンサー
    • PHP
  • 初心者です。html フォームの使い方

    一個のセレクトボタンで 異なる nameで、異なる valueを送信したいです やりたいことは 人の名前で選択できるようにしていて その名前を選択すると名前と画像をpostしたいです。 好きな場所に表示したいので異なる nameを使いたいです Javascript か htmlでお願いします 助けてください、よろしくお願いします。

  • if文での条件分岐後の出力内容を他のページへ移動させたい

    お世話になります。現在ショッピングカートを製作しているのですが、b.phpで条件分岐をし、商品名、金額を表示させるのですが、表示させた内容をどのようにしたら、c.phpやd.phpに移動させることが出来るのでしょうか?ちなみにセッションを利用しています。 a.php(選択画面)→b.php(商品名・金額を表示)→c.php(送付先入力)→d.php(送付先入力確認)→e.php(メール送信) a.php ------------------------------------------------- <form name="form1" method="post" action="b.php"> <input type="radio" name="a" value="1">ラーメン <input type="radio" name="a" value="2">ソバ <input type="radio" name="b" value="1">うどん <input type="radio" name="b" value="2">パスタ <input type="submit" name="Submit" value="送信"> </form> ------------------------------------------------- b.php <form name="form1" method="post" action="c.php"> <?php session start(); $_SESSION['php']=$_POST['a']; $_SESSION['p']=$_POST['b']; ?> <?php if($_SESSION['php']==1 && $_SESSION['p']==1){ print "ラーメン&うどん" } 省略 ?> <?php if($_SESSION['php']==1 && $_SESSION['p']==1){ print "1000円" 省略 <input type="submit" name="Submit" value="送信"> </form> ------------------------------------------------- 上記のラーメン&うどん、と1000円をc.phpへ移動させるにはどのようにすればよいでしょうか? おわかりになられる方ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • 画像のファイル名をPOSTで渡す

    1.jpg 2.jpg 3.jpg の3つの画像ファイルがあります。 この3つの画像をボタンとして表示して押下したボタンの画像ファイル名をPOSTとして渡したいのですが、下記のソースだとどれを選択しても 3.jpgが渡されてしまうので困っています。アドバイスお願いします。 JavaScriptqを使用しても結構です。 <?php print '<form method="POST" action="b.php">' . "\r\n"; for($i=1;$i<=3;$i++){  print ' <BUTTON name="image" >' . "\r\n";  print ' <img src="../'.$i.'.jpg" >' . "\r\n";  print ' </BUTTON>' . "\r\n"; } print '</form>' . "\r\n"; ?>

    • 締切済み
    • PHP
  • phpのフォームについて

    phpで問合せフォームを作成中なのですが、分からない点が3点あります。 ご教示お願い致します。 (1)問合フォームの入力項目の最後の送信ボタンに下記のコードで「submit」を入れると、入力項目である郵便番号を入れると自動で住所表示(Ajaxzip2を使用)する機能が作動しなくなります。「submit」を入力しないと自動表示されますが、データーは送信されません。 どうしたらよいのでしょうか。 【問合せフォームの入力画面のコード/HTML】 <form method="POST" action="visit Application.php" > <h3 class="taitoru11">問合せ</h3> <label for="name">お名前を入力して下さい</label> <input type="text" name="name" id="name" placeholder="例)山田value=""> <label for="number">電話番号</label> <input type="tel" name="tel" id="tel" placeholder="例)0123" value="">   <label for="mail">メールアドレス</label> <input type="text" name="mail" id="mail" placeholder="例)" value="">    <label for="zip">郵便番号&nbsp;&nbsp;※必須</label> <input type="text" name="zip" id="zip" value="" placeholder="xxx-xxxx"maxength="8" />     <label for="addr">住所</label> <input type="text" name="addr" id="addr" /> <label for="addr2">マンション・部屋番号</label> <input type="text" name="addr2" id="addr2" /> <label for="comment">その他コメント</label> <textarea id="comment" name="comment" placeholder="問合せ内容をご記入ください" value="" wrap="hard" ></textarea> <input type="submit" value="入力内容を確認する" data-inline="true"/> </form> (2)上記のコードにある<input type="submit" value="入力内容を確認する" data-inline="true"/> を入力すると、ボタンを押さなくても、入力項目でエンターを2回押すと、送信先に勝手に送信されてしまいます。 どうしてでしょうか? また、ボタンを押さないと送信されない様にするにはどうすればいいのでしょうか。 (3)(1)のデーターの送信先で、上記の「その他コメント」欄については改行表示をさせたく、下記の様に「nl2br」を使ってみましたが、改行されませんでした。どうしたらよいのでしょうか。 【問合せフォームの送信先のコード/PHP】 <dl> <dt>お名前</dt> <dd><?php print(e($_POST['name'])); ?></dd> <dt>電話番号</dt> <dd><?php print(e($_POST['tel'])); ?></dd> <dt>メールアドレス</dt> <dd><?php print(e($_POST['mail'])); ?></dd> <dt>郵便番号</dt> <dd><?php print(e($_POST['zip'])); ?></dd> <dt>住所</dt> <dd><?php print(e($_POST['addr'])); ?></dd> <dt>マンション・部屋番号</dt> <dd><?php print(e($_POST['addr2'])); ?></dd> <dt>その他コメント</dt> <dd><?php print(nl2br(e($_POST['comment']))); ?></dd> </dl> 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • フォームでボタンクリック後にそのページに内容を表示する

    a.htmというファイルの中でフォームを使用しています。 フォームで送信のボタンを押すとフォームの内容を反映した文をphpを使用してb.phpに表示させています。 送信ボタンを押すとb.phpのページに飛んでしまいますが、a.htmの送信ボタンの次の行くらいにb.phpの内容を表示させるようにしたいです。 どのように記述すればできるでしょうか?

  • フォームのボタンをSUBMITから画像にしたいのですが…

    フォームを使って値を渡すのに <INPUT TYPE=SUBMIT NAME=WORD VALUE='*****'> とボタンを作成し、VALUEの値 (中身を確認、とか送信実行とか) で動作を分岐し、実行していました。 このボタンを画像にしたいのですが、 値を渡すのはGETじゃないと無理でしょうか? (今まではPOSTで送信) ボタンを画像にするとなると <A HREF='**.cgi'><IMG SRC='**'></A> となるので、 <A HREF='**.cgi?key=****'><IMG SRC='**'></A> のように、する必要があるのかなぁ?と思いまして… せっかくPOSTで受け取るようにCGIを作成したので、 できればPOSTのままで使用できればと思うのですが。 (無理ならGETに変更するしかないですけど) VALUEの値はボタンでは送信できないので、 <INPUT TYPE=HIDDEN NAME=WORD VALUE='****'> として渡そうと思ってます。 他に何かよい方法あるでしょうか? ※Perl使用です。

    • ベストアンサー
    • Perl
  • whileループの中でフォーム入力を入れられますか?(ループする処理メニュー選択の書き方)

    whileループの中にフォーム入力を入れたphpスクリプトを、ブラウザから指定しても何の動きもありません。 操作メニューをフォーム入力によって指定し、処理が終わればまた戻ってくる構造を、1つのセッションの中で行いたい場合はどのように記述すれば適切でしょうか。 実験したスクリプトは次のものです。 なお、このスクリプトからwhile文を削除した場合の動作は正常でした。 phpのバージョンは4.3.10です。 <?php // // form入力が入っているwhileループの実験 // while ($_POST['select_num'] != 2) { if (!isset($_POST['select_num'])) { $location_next = $_SERVER["PHP_SELF"]; print "<form method=\"post\" action\"{$location_next}\">"; print "<input type=\"radio\" name=\"select_num\" value=\"1\">選択1"; print "<br><br>"; print "<input type=\"radio\" name=\"select_num\" value=\"2\">中止"; print "<br><br>"; print "<input type=\"submit\" name=\"sbmt1\" value=\"OK\">"; print "</form>"; } else { print ("select_num = " . $_POST['select_num']); print "<br>"; } // if文の終了 } // while文の終了 print ("select_num = " . $_POST['select_num']); print "<br>"; print "whileループを終了しました<br>"; ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう