![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
自分なりにいろいろ試してみたのですが出来なかったので、お教えいただきたいと思い、質問させていただきます。
現在、perlを使ってCGIを組んでいます。
(というよりは組まれていたCGIを編集しています)
その中で、外部から入力された文字列データを変数に格納し
それをprintで書き出しています。
以下のような形です。
--------------------------------------------------
open(IN,"$datfile");
while (<IN>) {
my ($no,$date,$name,$comment,$ip) = split(/<>/);
print "<div class=\"line_wrap\">";
print "<div class=\"line_left\">$date</div>";
print "<div class=\"line_right\">$comment</div>";
print "</div>";
}
close(IN);
--------------------------------------------------
なんとなくでしか理解できてないのに編集したのでおかしい部分もあるとは思いますが・・・。
今回お伺いしたいのは
$comment
という変数内に、HTMLタグが入っていた場合、そのままの状態で吐き出されてしまうことになり困っています。
変数内の文字列に記載されているHTMLを、HTMLとして認識して実行したいのですが(要はリンクを貼りたい)可能でしょうか?
外部から入力されているものですので、HTMLがあったりなかったりします。
何か方法があれば、教えていただきたいです。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
まず、
my($no,$date,$name,$comment,$ip) = split(/<>/);
~の部分ですが…。
区切り文字が「split(/<>/)」で“<>”となっていますので、“\t”とかに変更して。最初に読み込んでくるDATA(この場合は「$datfile」です)にコメントが書き込まれる処理の時に、区切り文字が“\t”で処理される様に書き直す必要があります。
HTMLタグに必要な“<>”を区切り文字に使っているので。
コメント中にHTMLタグが含まれていた場合、予期せぬ箇所でコメントが分断されたりしているせいだと思われます。恐らくは元になったCGIプログラムのオリジナル製作者が、安易にHTMLタグをコメント文に含まない様にセキュリティの意味でそうしてるのだと思われます。
またHTMLタグをコメント文中に許可する場合。
HREFタグに偽装して悪意あるコードを実行されない様に、かなりコメント文を慎重に精査して変換処理を加える必要があると思います。またPerlで実行するので、Perl特有の「冗長なエンコードの問題」を付かれない様に注意する必要もあります。
この回答への補足
ありがとうございます。
“<>”を“\t”に変えて、吐き出しをさせることが出来ました。
しかしながら、まだタグは有効ではないようです。
でも、<>で区切るよりは、個人的にもこちらが好きですし、とても勉強になりました。
ありがとうございました!
回答ありがとうございます。
なるほど~・・・と納得しました。
区切り文字が<>だということに気づいていながら、それがHTMLタグで混乱させているということに気づけず申し訳ないです。
まずは外部から入力したときに使用している区切りを“<>”から“\t”に変更しなければならないということですね。
掲示板のようなところから、第三者に入力してもらい、それをdatファイルに書き出して、そのデータ区切りが“<>”になっているので、それが“<>”になるよう指定しているcgi部分を探りたいと思います。
いろいろ試してみましたが(関係している3つのcgi内の“<>”をすべて“\t”に置換するとか・・・)、まだ理解力が足りないようで解決できませんでしたが、糸口が見つかりました。ありがとうございます!
No.3
- 回答日時:
なるほど。
既に
$comment =~ s/&/&/g;
$comment =~ s/</</g;
$comment =~ s/>/>/g;
これと同じ処理がされているのですね。
それを外せばタグはタグとして実行されますが、XSSなどの危険性は覚悟してください。
再びありがとうございます。
--------------------
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/\r\n/<br>/g;
$val =~ s/\r/<br>/g;
$val =~ s/\n/<br>/g;
----------------------
多分?これがその役目を果たしているのだと思い、消してみましたが、特に変わりはありませんでした。
皆様の意見を聞いていると、やはりHTMLを使えるようにすることはかなりのリスクがあるようですね。皆様がそう注意をしてくださる中、まだやろうとするのも申し訳ないのですが、もう少し研究してみます。
ありがとうございました!
No.1
- 回答日時:
タグがタグとして実行されるなら、そのままリンクタグも有効です。
タグを文字列として表示したいなら、
$comment =~ s/&/&/g;
$comment =~ s/</</g;
$comment =~ s/>/>/g;
として変換し、
http://と書かれていたら自動リンクするならば、
$comment =~ s/(http?\:[\w\.\~\-\/\?\&\=\;\#\:\%\*\+]+)/&autoexg($1)/eg;
sub autoexg{
$local = $_[0];
$output = "<A href=\"$local\" target=\"$target\">";
$output .= "リンクです→$local";
return($output);
}
とでも行えばいいような気がしますが。
(あくまでも例なのでご質問者さまの要求に合わせて変更してください)
早速のご回答ありがとうございます!
回答を参考にいろいろ試してみましたが、望む結果が得られませんでした。
>タグがタグとして実行されるなら、そのままリンクタグも有効です。
cgi内にprintで記述しているタグはそのまま実行されるのですが
変数($comment)内のタグは実行されません。
下記のように、そのまま表示されてしまいます。
---------------------------------------------------
<a href="http://www.yahoo.co.jp">あいうえお</a>
---------------------------------------------------
外部から入力する際に、「"」を「\"」として入力し、エスケープさせてみましたが、その場合も
---------------------------------------------------
<a href=\"http://www.yahoo.co.jp\">あいうえお</a>
---------------------------------------------------
とそのまま出力されてしまいます。
タグ部分を表示せず、
「あいうえお」
と表示され、そこにリンクをつけた状態にするにはどうしたらよいのでしょうか・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- HTML・CSS 吹き出し 下記の吹き出しのスタイルシートについて 下記のスタイルシートは左側にアイコンがでる使用にな 1 2022/11/12 17:55
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数内でHTMLを使用したいです
-
socket通信でレスポンスを受け...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
16進の10進変換について
-
メモリをアドレスを直接指定し...
-
formで特定のinputを送信しない...
-
CGI(Perl)で、Net::FTPを使いたい
-
sendmailで複数アドレスに送信...
-
VB6で、長い時間かかる処理...
-
複数列を持ったリストボックス...
-
<SELECT>タグの折り返し
-
【至急!!!】python言語で本を見...
-
文字の横にプルダウンを表示さ...
-
sendmailで複数の宛先にメール...
-
シェルスクリプトで、空白(ス...
-
セレクトボックスのselected属...
-
初回起動のみ判別したい
-
phpでボタンを押したときに変数...
-
python3について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CLispのloop内の挙動について
-
Perlで自分自身の関数名を知る...
-
Net::Telnetでタイムアウト時間...
-
print <<"_HTML_"の中でサブル...
-
10進数→2進数
-
Rubyのgets関数について
-
作業域が消える(ように見える)
-
CGI初心者です
-
Perlで複数の値を返す良い方法...
-
検索機能の作成で困っています
-
ハノイの塔の問題で困っており...
-
foreach 回数制限
-
Pythonのマルチプロセスでの並...
-
LISPで連想配列の操作?
-
PERLの「!=」と「=~」 or...
-
Wコロン
-
PerlでCabochaを呼び出すには(...
-
シェルでawkを使い行数を取り出...
-
Perlですが、redoの処理がいま...
-
icmp socket error
おすすめ情報