[PHP-users 31298] \記号のエスケープについて

Mihashi pml_384 @ yahoo.co.jp
2007年 1月 22日 (月) 16:49:58 JST


はじめまして。三橋と申します。

先ほど送らせていただいた、MLが環境によって文字化けしていたため再送いたします。
ご迷惑をおかけします。

以下のサンプルを実行した際に予期せぬエスケープが行われて、JavaScriptの構文エラーとなってしまいます。
環境設定の問題だと思うのですが、見当がつかないため、ご教授宜しくお願い致します。


// サンプル

<?php

Session_Start();

$rtnStr = <<< RTN_STR
<HTML>
<HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
    <TITLE></TITLE>
    <SCRIPT language="JavaScript">
    <!--
        function chg(typ){
            if( typ == 1 ){
                lineStr = "<INPUT type='text' name='In_Text' value='tst'>"
                        + "<A href='javascript:chg(2)'>CLEAR</A>";
            }else if( typ == 2 ){
                lineStr = "<INPUT type=\"text\" name=\"In_Text\" value=\"\">"
                + "<A href=\"javascript:chg(1)\">SET</A>";
            }
            document.getElementById( 'TEST' ).innerHTML = lineStr;
        }
    //-->
    </SCRIPT>
</HEAD>
<BODY>
    <FORM name="MainForm" method="post">
        <INPUT type="hidden" name="ChrSetChkStr"  value="雀の往来">
        <TABLE width="505" border="0" cellpadding="0" cellspacing="0">
            <TR>
                <TD ID="TEST">
                    <INPUT type="text" name="In_Text" value="">
                    <A href="javascript:chg(1)">SET</A>
                </TD>
            </TR>
        </TABLE>
    </FORM>
</BODY>
</HTML>
RTN_STR;

echo( $rtnStr );

?>
//



エスケープ内容(JavaScriptのtyp=2の記述部分で起こります。)
1 \  ⇒  "\"                        // 両サイドに『"』が付加されます
2 \  ⇒  "\?PHPSESSID=c4c8・・・"      // 左側に『"』、右側に『?PHPSESSID=値"』が付加されます

1は<INPUT>タグ内で、最初に記述されている\記号に対して、エスケープされます。
  例)        lineStr = "<INPUT type="\""text\" name=\"In_Text\" value=\"\">"
                                     ~ ~
                                      ↑この部分

2は<A>タグ内の『href=』の中の\記号をエスケープしています。
  例)                + "<A href="\?PHPSESSID=値""javascript:chg(1)\">SET</A>";
                                 ~ ~~~~~~~~~~~~~~
                                  ↑この部分



以下の処理を行うと、エスケープは行われません
※typ==1の記載方法だと、エラーを回避することは可能です。
※JavaScriptエラーが表示されている時に、ブラウザの更新ボタンを押すとエスケープはされません。
※一度サンプルを表示した画面で、再度表示をすると、エスケープはされません。
※Session_Start()を行わない


実行環境1
  PHP Version 4.2.3 
  Apache Version Apache/1.3.33 



以上、宜しくお願い致します。

--------------------------------------
Start Yahoo! Auction now! Check out the cool campaign
http://pr.mail.yahoo.co.jp/auction/



PHP-users メーリングリストの案内