• 締切済み

CGIフォーム、タグの表示について。

フォームを使い書き込まれた内容を表示させるのに、 <TR>などのタグをタグとしてではなく、単なる「<TR>」という文字として表示させるためには TEXTAREAしか方法はないのでしょうか? <B>などはまぁいいのですが、<TR>などですと、レイアウトが崩れるほかに、文字の表示が正常に行われません。

  • Perl
  • 回答数12
  • ありがとう数30

みんなの回答

  • ticky
  • ベストアンサー率36% (123/337)
回答No.12

<を&lt;とするのは、Perlの仕様ではなくて、HTMLの仕様です。 ですから、HTMLのソースコードに、 &lt;tr&gt; と書くと(または書いてあると)、 ブラウザの画面には、 <tr> と表示されるわけです。 逆に、HTMLのソースコードに <tr> なんて書いてあったら、それこそHTMLとして解釈されて、テーブルが崩れるはずですが....

KODAMAR
質問者

お礼

&lt;とかくと<と表示されて、でもタグにはならないんですね! ちょっとひとつ利口になりました。 今までタグを表示させる時にはtextareaを使用していました。

  • estea
  • ベストアンサー率44% (39/87)
回答No.11

出力さえされないってのは変ですなぁ。 ひとまず、こちらで再現してみないと問題点が指摘できないんでぇ、 サンプルのデータファイル(の一部)と、 表示を担当しているコードの一部を書いていただけませんか? 可能性ばかり論じていても収拾つきそうにありませぬ。

KODAMAR
質問者

お礼

●書き込み用 read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ s/"/"/g; $buffer =~ s/</</g; $buffer =~ s/>/>/g; $buffer =~s/\r\n/<BR>/g; $buffer =~s/\r/<BR>/g; $buffer =~s/\n/<BR>/g; $buffer =~ tr/+/ /; $buffer =~ s/'/\'/g; $buffer=~ s/ //g; foreach $pair (split(/%/,$buffer)){ ($name,$value) = split(/=/, $pair,2); $value =~ tr/+/ /; $FORM{$name} = $value; $FORM{$name} =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} =~ s/"/"/g; $FORM{$name} =~ s/</</g; $FORM{$name} =~ s/>/>/g; $FORM{$name} =~s/\r\n/<BR>/g; $FORM{$name} =~s/\r/<BR>/g; $FORM{$name} =~s/\n/<BR>/g; $FORM{$name} =~ tr/+/ /; $FORM{$name} =~ s/'/\'/g; $FORM{$name} =~ s/ //g; $TITLE = $FORM{'TITLE'}; $DATE = $FORM{'DATE'}; $NAKAMI = $FORM{'NAKAMI'}; $WORD = $FORM{'WORD'}; } open(FH,">>log.log"); print FH "TITLE=$TITLE%DATE=$DATE%NAKAMI=$NAKAMI%TIME=$year/$mon/$day $hour:$min:$sec%SEARCHKEY=$year$mon$day$hour$min$sec\n"; close(FH);

KODAMAR
質問者

補足

●表示用 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; for ($i=0;$i<$gyou;$i++){ # 日付順 @sort2 = sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; $sort2[$i] =~ s/&quot;/"/g; print "<TABLE>\n"; print "<TR>\n"; @log_data = split(/%/,$sort2[$i]); foreach (@log_data){ ($key,$value) = split(/=/,$_); $FORM{$key} =~ s/&lt;/</g; $FORM{$key} = $value; $FORM{$key} =~ s/%3D/=/g; $FORM{$key} =~ s/&lt;/</g; $FORM{$key} =~ s/&gt;/>/g; $FORM{$key} =~ s/%3c/</g; $FORM{$key} =~ s/%3e/>/g; $FORM{$key} =~ s/%2d/-/g; } print "<TD WIDTH=80><font color=deeppink>&hearts;</font><font color=deeppink>♡</font>$FORM{'DATE'}</TD>\n"; print "<TD WIDTH=550><A HREF='search.cgi?KEY=$FORM{'SEARCHKEY'}'>$FORM{'TITLE'} [$FORM{'TIME'}]</A></TD>\n"; } #for こんな感じになってます。

  • K5237
  • ベストアンサー率56% (55/97)
回答No.10

>勝手に=と&で設定されてるんでしたっけ? >これを=と%にするにはどのような設定が必要なんでしょうか? 設定云々の前に,「=」と「&」以外にできませんね。 <input type="hidden" name="field1" value="1234"> <input type="hidden" name="field2" value="5678"> (↑このソースは間違っている可能性もあります) とした場合,送られるデータは field1=1234&field2=5678 として送られます。これはHTTPの仕様だと思いますので,CGI作成者が設定できるものではないです。 ちなみに,半角スペースは「+」となります。ご参考までに。

KODAMAR
質問者

お礼

回答ありがとうございます。 そうですかー。 やっぱり無理なんですね…。 やったことないなぁとは思いましたが。。 +と'は以前に指摘されて覚えていました。

  • K5237
  • ベストアンサー率56% (55/97)
回答No.9

>ログファイル記述時に&は使わない方がベストなのでしょうか? それはKODAMARさん次第です。同じ1つのことを実現するにしても,プログラムを書く人によって違いますから。 ですから,KODAMARさんが「&」を使わないほうがいいと思うなら使わないほうがいいです。使わないなら使わないなりに自分でプログラムを書いてください。 掲示板はPerlの参考書などを見ながら作られていますか? でしたら掲示板のプログラムも載っていると思います。それを見てログの保存,読み込み,表示をどのように処理しているか見てみてください。 以前の質問で,解読するのも難しいと書かれていましたが,ある程度プログラムが読めないとプログラムを書くのは結構難しいと思いますよ。 何事も覚えるには "読み・書き" が大事!!(^^;)

KODAMAR
質問者

お礼

回答ありがとうございます。 どーしても&だとうまくいかなそうなので、%を使ってやってみようかなーと思い出したところです。 たまには変えてみて、いつも「当たり前」だったことを復習してみるのもいいかと。 早速つまづきましたが(笑) フォームのデータって何も設定しないと、勝手に=と&で設定されてるんでしたっけ? これを=と%にするにはどのような設定が必要なんでしょうか? よくよく考えたらやったことありませんでした。 掲示板は今までの自分なりに蓄積した概念と、途切れ途切れのコードを組み合わせてつくってます。 説明書などは、その途中でちょこっと見たりする程度で、流れは自分なりに考えてつくってますので、 一般論からすると、おかしな流れやコードになってると思われます。 これが完成し、無事動くようになったら、書籍を見て、プロが書くコードと照らし合わせてみようと思っています。

  • feininger
  • ベストアンサー率41% (74/180)
回答No.8

> というように=と&で行っているので、<>で誤動作は考えにくいのですが。。 &lt;や&gt;には&が含まれていますけど、処理上に問題はないですか? とりあえず、「HTMLソースに問題あり」というのがはっきりしたので、 そこからまた新たな手がかりが見えてくるかと。

KODAMAR
質問者

お礼

すいません、思い出しました。 &lt;などには&が使われているから強制的に<に戻そうと思ってcgiかいたことを…。 ログファイル記述時に&は使わない方がベストなのでしょうか?

KODAMAR
質問者

補足

追加です。 表示用のcgiファイルでは、&lt;などは勝手に表示される、とのことで消したのですが… <B>テストです。 あー。 と入力して、表示させたのですが、何も表示されません。 ソースにも表示されません。 ログファイルを開くと、 &lt;B&gt;テストです。&lt;BR&gt;あー。 と入っているので、入力はきちんと行われているようです。 なぜ<や>は表示されないのですか?

  • feininger
  • ベストアンサー率41% (74/180)
回答No.7

> ソースの方をみてみても、同じくその後は入力されていません。 > …ということは<TR>のタグが原因ではないですね…スイマセン。 まったくの勘ですが、ログのセパレータに<>なんかを使っていてばっさり削除されてしまったとか? (もうすこし情報がないとなんともいえません) ・・・で、ちょっと気になったのが、 フォームへ入力したタグが、そのままタグとして機能してしまうのは、 レイアウト崩れよりもセキュリティとして大問題なので注意したほうがよいですよ。 > <TR>などのタグをタグとしてではなく、単なる「<TR>」という文字として表示させるためには > TEXTAREAしか方法はないのでしょうか? <textarea></textarea>で囲まれた部分はタグとして機能しませんのでそのまま表示されますが、 こんな感じ↓でフォームへ入力されたら危険です。 </textarea><span style="font-size:100px;">巨大</span>

参考URL:
http://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html
KODAMAR
質問者

お礼

回答ありがとうございます。 今つくっているのは私以外誰も使うものではないのでセキュリティは気にする必要はなく、楽なんですが…。 (公開するものはタグ禁止にします。) ログファイルの書き込みは 1つめのタイトル(表記名)=1つめのデータ&2つめのタイトル… というように=と&で行っているので、<>で誤動作は考えにくいのですが。。

  • estea
  • ベストアンサー率44% (39/87)
回答No.6

気になっていたのですが、あなたの言う表示ってどれのことですか?ブラウザでの表示?それともブラウザでいう「ソース」での表示? それぞれ意味が違いますのでそれをはっきりさせましょうや。 で、ブラウザでの表示に関する場合は、「ソース」をブラウザがHTMLなどとして解釈した結果ですので、本来ココで問題になるべきは、「ソース」でしょう? 下でお聞きの、「<tr>の後から表示が無い」ってのもソースには出力されているのですか?結構重要なことだと思いますよ。

KODAMAR
質問者

お礼

回答ありがとうございます。 表示がされない、と言っている「表示」は「ソース」のことです。 混乱させてすいません。 ソースの方をみてみても、同じくその後は入力されていません。 …ということは<TR>のタグが原因ではないですね…スイマセン。 これは何が原因かおわかりになりますか?

  • selene_pl
  • ベストアンサー率49% (102/207)
回答No.5

>今の状態では&lt;が<に、&gt;が>に表示されるようになってます。 どうも、この作業が、余計っぽいです。 HTMLのソースに「&lt;」があれば、ブラウザが自動的に「<」に見せてくれるんです。 なので、&lt;を、変換せずに、そのまま出力すればいいかと。 つまり、テーブルの中に 「たとえばテーブルのタグには<TR>などがあります。」 と書きたいのなら、CGIの出力として、 <TR><TD>たとえばテーブルのタグには&lt;TR&gt;などがあります。</TD></TR> とすればいいはずです。

KODAMAR
質問者

お礼

回答ありがとうございます。 &lt;や&gt;の変換記述は削除しました。 Print #FNO, &quot;&lt;TR&gt;&quot; (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?

  • K5237
  • ベストアンサー率56% (55/97)
回答No.4

selene_plさんの書かれたとおりでできます。 CGIが書き出すHTMLソース上で「&lt;TR&gt;」とすれば,HTMLの表示上は<TR>となりますので。 例を示すと… <TR><TD>たとえばテーブルのタグには&lt;TR&gt;などがあります。</td></tr> ↓表示結果 たとえばテーブルのタグには<TR>などがあります。 となります。 >今の状態では&lt;が<に、&gt;が>に表示されるようになってます。(ログファイル呼び出し時) となっていますが,これはHTMLソースを書き出すときにこの変換作業をしているのですか? でしたらこれは必要ないです。上の例が示すとおり,変換作業無しに「<TR>」と表示することできます。

KODAMAR
質問者

お礼

知りませんでした。 今まで無駄なことをかいてたんですね~。 Print #FNO, "<TR>" (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?

  • namiri_e
  • ベストアンサー率37% (37/98)
回答No.3

> 今の状態では&lt;が<に、&gt;が>に表示されるようになってます。(ログファイル呼び出し時) > ただコレですと、例えば今はテーブルでログファイルの表示のレイアウトを作っているんですが、いきなり<TR>とか出たらそこでテーブルのレイアウトが崩れてしまいますよね? &gt;や&lt;は、htmlで表示時には自動的に、 単なる文字としての「>」「<」として表示されるだけなので タグと認識されないので、テーブルは崩れないと思います。 もし心配でしたら、ログに保存するときは<TR>のような形のままにして、 ログファイル読み込み時に「<」を「&lt;」に「>」を「&gt;」に変換して、 テーブル内に表示していけばどうでしょう?

KODAMAR
質問者

お礼

&gt;や&lt;はわざわざ変換しなくていいんですね! 知りませんでした。 早速変換させてたところを消してみました。 ですがやはりできない…。 Print #FNO, &quot;&lt;TR&gt;&quot; (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?

関連するQ&A

  • CGIのtextareaへのタグの表示

    CGI(Perl)でWebのメモ帳のようなプログラムを作っています。 何種類かのHTMLタグの使用もできるようにしてあり、更に タグ説明のために &lt; &gt; などを記入することもあります。 初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を 編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と &lt; &gt;が どちらも <>に変換されてしまい、説明中の HTMLタグ文字列がタグになってしまいます。 例えば A: 最初の記入時「&lt; a href・・・ &gt; はリンクタグ」などと記入してアップロード B: サーバーログには「&lt; a href・・・ &gt; はリンクタグ」のまま記録される C: 編集のためにその記事を再表示させるとブラウザが「<a href・・・ >はリンクタグ」 と表示する D: 別の部分を編集後再アップロードするとログには <a href・・・ > がタグとして記録される E: 以降の表示では <a href・・・ > の部分がリンクタグとして扱われ「はリンクタグ」にリンクがかかる というような問題に悩んでいます。 textarea 内では <code>タグも使えなさそうで・・・ 思案の末、 textarea への送信時だけ 「 &lt; 」を 「<<」などとして送信し、CGIが「<<」を受け取ったら &lt; に変換してログ記録する などのローカルな方法を考えましたが、あまりスマートではないかと。 定石のような方法はないのでしょうか?

    • ベストアンサー
    • CGI
  • フォーム1[デザイン]タグが表示されない

    言語:Visual c++ 2008 Express Edition OS:win xppro VC++であるプロジェクトの画面中央にあるプログラムが表示されているところに、 フォーム1[デザイン]タグ がありません。 他のプロジェクトではフォーム1[デザイン]タグは表示されます。 やりたいことは、 フォーム1[デザイン]タグを表示して、プロパテイに値を設定することです。 このプロジェクトのフォーム1[デザイン]タグを表示する方法を知っている方がありましたら教えて下さい。 よろしくお願いします。

  • HTMLタグに詳しい人に質問なんですが

    テーブルタグ内の文字を装飾するには<font color="">タグや<b>タグなどで <tr><td><font color="red"><b>文字</b></font></td></tr> のようにする以外にできる方法はないでしょうか?

  • CGIフォームでのformタグとjavaでのformタグが重複して…

    フォーム(CGI)で入力するするときに、カテゴリと言う項目を作って、プルダウンでそれぞれ大カテゴリ・中カテゴリ・小カテゴリと分けてそのカテゴリにあった項目を吐き出したいのですが、 ネットで調べましたら、JavaScriptで表示ができるとの事で、試行錯誤の結果、ちゃんと表示できるようになったのですが、CGIフォーム内でのformタグとjavaでのformタグが重複してプルダウン内のカテゴリが表示しなくなりました…。 私のやりたい方法としては、「教えて!goo」での投稿カテゴリーの様な方法(http://oshiete1.goo.ne.jp/oshiete_new.php3)でできればベストと考えております。 解決方法としてはどの様な方法がありますか? 皆さんお忙しいでしょうけど、ご教授下さい。

  • <tr>タグ、<td>タグ

    テーブルでレイアウトを行い、htmlで背景色・cssで文字のスタイルを適用する場合、<tr>タグと<td>タグのどちらに記述するのがよいのでしょうか。IEだと大差は無いようなのですが、firefoxやNetscapeで違いが出てくるように感じます(特にfirefox)。 (1)cssで文字スタイルの場合、<table>タグに<table class="text">といった感じで問題ないでしょうか(table内の文字すべてclassがtextの場合)。それともやはり<td>タグひとつひとつにクラス指定した方が良いのでしょうか。 (2)テーブルに背景色を指定する場合、<tr>タグ・<td>タグのどちらに指定するのが良いのでしょうか。

    • ベストアンサー
    • HTML
  • フォームの一部のみを目立つようにする(太字・色を変更・ハイライト)方法はありますか?

    フォームの一部分の文字列のみを目立たせる方法を探しています: <form> ... <textarea name="hoge">あいうえお<b>かきくけこ</b>さしすせそ</textarea> ... </form> のように書いても、もちろん思惑通りには表示されません。 (「かきくけこ」の部分のみ太字にして、「あいうえお」と「さしすせそ」の部分はそのままにしたいのですが。。。) どなたかよい方法をご存知でしたら教えてください。よろしくお願いしますm()m

  • TR タグの表示・非表示を一括できりかえたい。

    TRタグの表示・非表示を一括できりかえたいと思い、2種類方法を思いついたのですが、 具体的な書き方がわからず・・・。どこか参考になるサイトなどありませんでしょうか。 また自分が書いた2種類以外にこんな方法があるよなどありましたら教えてください。 (1).TRタグにclassを設定して切り替える。 (2).他にXMLファイルを用意して、毎回XMLファイルを読み込んで切り替える。 よろしくお願いします。

  • メールフォームのHTMLタグ

    メールフォームで 名前・メールアドレス・件名・本文 の文字の色を白で表示し、字を入力する部分を赤にしたいのですが、そのタグを教えてもらえませんか? あとソースからメールアドレス見えないようにする方法はありますか?

  • 並べて表示するタグを教えてください!

     画像、文字などを並べて表示する方法がわかりません、、、。 どのようなタグにするのか教えてください、、、。 お願いします。

  • <textarea>に<pre>を使うと・・・

    質問お願いします。 htmlとcgi等を使用してHPを作っているのですが、その中にtextareaを利用して、 投稿フォームを設けています。投稿したものは、違うページで閲覧できるようになっています。 この投稿フォーム、wordやexcelから文章をコピぺして使用する方が多いのですが、 そのままでは<P>タグが挿入されてしまい、閲覧時、文章間隔が広くなりすぎて見難いため、 投稿フォームを、<textarea><pre></pre></textarea>とし、受信時、cgiで<P>タグを削除しています。 レイアウトはこれで問題ないのですが、textarea内に<pre>タグを入れてしまうと、 textareaの横幅をオーバーして書き込めてしまうという事態が起こってしまいました。 そこで質問なのですが、textarea内に<pre>を入れても、文字入力が端まで行ったら、 次の行に折り返す方法はないでしょうか? わかる方いらっしゃいましたら、ご教授の程よろしくお願いします。

    • ベストアンサー
    • HTML