プロが教えるわが家の防犯対策術!

ただいまperlにて掲示板を製作中です。PC上でApacheを使いチェック中なのですが、タグなどで仕様する不等号を変換することが出来ません。下記のように処理しているのですが、なぜか変換されません。

foreach (@data){
s/&/&/g;
s/>/>/g;
s/</&lt;/g;
s/"/&quot;/g;
s/\r\n/\<br\>/g;
s/\n/\<br\>/g;
}

ちなみにs/&/&amp;/g;の[&amp;]の部分を[AA]等に変更すると
問題なく[&]は[AA]に変更されます。
なぜなのでしょうか?表示時にタグとして認識されてしまい困っております。どうかご教授下さい。

A 回答 (7件)

>(3)→(4)への受け渡し時に問題があるようです。


同一CGIでの処理かと思っていましたが、
(3)ブラウザで表示→フォーム送信→CGIで受け取る(4) ですか?

>つまり、ブラウザを通すとデコードされます。
#5の回答に書きましたが、そういうことです。
ブラウザを通した段階で、デコードされますので、(4)で再度エンコードの必要があります。


>splitで分割した物も$writelogに反映されてしまうのでしょうか?

splitしたものは、別の変数に入れてますよね?これは関係ないと思います。


>(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、

そのままとは、 $writelogをformのhiddenで渡しているって事でしょうか?何にしろ、ブラウザがHTMLを解釈する段階でデコードされますので、ブラウザを経由したら再度エンコードの必要がありますよ。


>ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。

これは必要な処理ですね。問題解決かな。
お疲れ様でした。
    • good
    • 0
この回答へのお礼

有難うございました!
その通りhiddenで渡してました。
てっきり出力はされていないので大丈夫だと思っていました。
しかしhiddenで受け渡してもダメだったのですね。

親切に有難うございました。

お礼日時:2007/01/04 17:18

再度の補足有難うございます。

しかし、疑問は深まる一方です。(^^;
説明のため番号を付けて置きます。

(1) 名前(name) メール(mail)・・・受け取ります。
(2) 置換をします、@dateをjoinして($writelog)します。
(3) $writelogをsplitし一度でブラウザに表示します。
(4) $writelogをログファイルに書き込む。

フォームで名前を <b>aaa</b> と入力したとします。

(3)のブラウザ上の表示は
 (a) <b>aaa</b>
 (b) aaa (太字)
 (c) &lt;b&gt;aaa&lt;/b&gt;

(a)ですよね?この段階では正常ですよね?
(b)なら置換されていません。
(c)にはなりません。

ひょっとして、ログファイルをブラウザで開いてます?

(2)の後、(3)の後で $writelog の内容を出力してみてください。
open(IN,">>test.txt");
print IN $writelog;
close IN;

この回答への補足

こちらこそご丁寧に有難うございます。

(1) 名前(name) メール(mail)・・・受け取ります。
(2) 置換をします、@dateをjoinして($writelog)します。
(3) $writelogをsplitし一度でブラウザに表示します。
  ※誤字がありました。すいません。一度ブラウザにです。入力内容を確認しています。
(4) $writelogをログファイルに書き込む。

  ※補足この間サブルーチンを3個使用してまして(1)(2)sub1→(3)sub2→(4)sub3となっております。

>(2)の後、(3)の後で $writelog の内容を出力してみてください。
(2)の後、(3)の後それぞれ
&lt;b&gt;aaa&lt;/b&gt; となりました。

(4)でも出力してみたところ
<b>aaa</b>となってました。
原因はそこみたいです。

ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。(3)→(4)への受け渡し時に問題があるようです。
(3)の段階でブラウザに表示する内容はsplitで分割した物を出力し(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、splitで分割した物も$writelogに反映されてしまうのでしょうか?もしかして原因なのでしょうか?

補足日時:2007/01/04 15:43
    • good
    • 0

ご存知だとは思いますが、念のため。


<html><body>
&amp;aa
&lt;bb&gt;
&quot;cc&quot;
dd<br>dd
ee<br>ee
</body></html>

これをブラウザで表示すると
&aa <bb> "cc" dd
dd ee
ee

こうなります。つまり、ブラウザを通すとデコードされます。



>'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。

ログテキストとは何でしょう?

この置換部分は問題ないと思いますので、置換した後、ログを書き出すまでに、ブラウザのフォームなどで再変換されているのでは?

置換してから、ログテキストを書き出すまでの流れを教えてください。

この回答への補足

すいません、ログテキストとは書き込まれた内容を保存しておくテキストファイルのことです。説明不足でした。
流れを書きますと、

まずブラウザ上での投稿内容を入力しその内容を
名前(name) メール(mail) タイトル(title) メッセージ(mess)として受け取ります。

受け取った内容を@dateとして、それを置換をします(問題部分)、@dateをjoinして($writelog)します。

投稿の内容を確認するためのサブルーチンで
$writelogをsplitし一度でブラウザに表示します。

$writelogをログファイルに書き込む。

以上のような流れになっております。

補足日時:2007/01/04 14:25
    • good
    • 0

#3です。


ブラウザ上で見てますよね。
それなら、置換されてますよ。

ソースを表示して確認してください。

この回答への補足

失礼致しました。
No.3のお礼のところに書いてしまったのですが、
それだけで実行したところ
&amp;aa
&lt;bb&gt;
&quot;cc&quot;
dd<br>dd
ee<br>ee
となりました。

しかし製作中の掲示板cgiをですと
'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"と書き込みを
してもまったく変換されず
'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。
ちなみに[AA]へ置換したところ問題なくログテキストに[AA]で保存されました。cgi初心者なのでまったく解らないのですが、&や不等号"等を変換してはいけない設定などあるのでしょうか?解らずにしていたなんてこともあるのでしょうか?

補足日時:2007/01/04 13:41
    • good
    • 0

例:


@data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee");
foreach (@data){
s/&/&amp;/g;
s/>/&gt;/g;
s/</&lt;/g;
s/"/&quot;/g;
s/\r\n/<br>/g;
s/\n/<br>/g;
}
$" = "\n";
print "@data";

結果:
&amp;aa
&lt;bb&gt;
&quot;cc&quot;
dd<br>dd
ee<br>ee

うちの環境では正常に置換されました。
そちらでは、実際どう置換されます?
上記の例の結果を教えてください。

この回答への補足

下記で出力してみたところ

my@data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee");
foreach (@data){
s/&/&amp;/g;
s/>/&gt;/g;
s/</&lt;/g;
s/"/&quot;/g;
s/\r\n/<br>/g;
s/\n/<br>/g;
}
$" = "\n";
print "Content-type:text/html\n\n";

print "@data";


結果は
&aa <bb> "cc" dd
dd ee
ee
となりました。

補足日時:2007/01/04 12:58
    • good
    • 0
この回答へのお礼

補足の補足です。すいません
open(IN,">>test.txt");
print IN"@data";
とテキストに書き出したところ、

&amp;aa
&lt;bb&gt;
&quot;cc&quot;
dd<br>dd
ee<br>ee

となりました。

しかし製作中の掲示板cgiをですと
'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"と書き込みを
してもまったく変換されず
'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。
ちなみに[AA]へ置換したところ問題なくログテキストに[AA]で保存されました。cgi初心者なのでまったく解らないのですが、&や不等号"等を変換してはいけない設定などあるのでしょうか?解らずにしていたなんてこともあるのでしょうか?

お礼日時:2007/01/04 13:38

>> [>] で単一指定化


[>] [<] ["] って意味で
    • good
    • 0

> s/>/&gt;/g;


> s/</&lt;/g;
> s/"/&quot;/g;
「>」「<」「"」を\でエスケープしてみるとか [>] で単一指定化してみるとか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!