• ベストアンサー

文字列とエスケープ

http://oshiete1.goo.ne.jp/qa3611556.html よく考えたらこれは不完全です。 $teststr ='";alert("あいう");var hoge ="'; とか書かれる可能性があるわけで。 エスケープの手段にはどのようなものがあるでしょうか?

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

  • ベストアンサー
  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

js記述の出力内容がエスケープされてあれば問題ないのでは $teststr ='";alert("あいう");var hoge ="'; $teststr = preg_replace('/(\'|")/', '\\\\$1', $teststr); ってこういう意味じゃないかな?

himajin100000
質問者

お礼

ありがとうございます。 元々は 俺がPHPに慣れてないのと面倒くさがりであるという理由で (丸投げで)手間かけさせてました(死 一応動作するようです。 が,少し考えた結果,俺の設計には大きな問題があるような気がします。 もともとCDATAマーク区間にしているのは application/xhtml+xmlでもtext/htmlでも動くように・・・・ のつもりだったんですが, $teststr =']]>'; とかやるとapplication/xhtml+xmlでコケます。 text/htmlでも $teststr = '</'; とかになると危ないかもしれません。 少し締め切らずもう少し落ち着いて考えてみようと思ってます。 #EcmascriptだけをPHPで出力するようにして XHTMLからそれをscript要素のsrc属性で呼び出す形の方がいいのかなぁ・・・

その他の回答 (1)

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.2

CDATA内であっても、終了以外で使う ]]> という文字列は例外でしょうし、それも置換するようにしとけばよいかと思います  > を &gt; </ についても  < を &lt; 不特定文字列をHTML出力する場面、例で言うとBBS等は、例外を除き必ずこのような処理を行っています (このサイトもそうです) エスケープについては下記が参考になるのではないでしょうか http://www.asahi-net.or.jp/~ps8a-okzk/xml/xml_2/escape.html

himajin100000
質問者

補足

過去そのような質問を受け,私自身も適切な回答を示せず,うやむやなものを出してしまったのですが,その場合 ]]&gt;が文字列として表示されてしまいます。表示されてほしい文字列は]]>なので意図と異なってしまいます 通常CDATA区間で]]>を表現したい場合, http://lowreal.net/logs/2005/07/07/2.html という手段をとることになります。 ただし,今回はEcmascriptの文字列の途中なので, ipt.textContent = ']]'; ipt.textContent = ipt.textContent + '>'; という風に分けて出力するようにPHP側で文字列を分割し, Ecmascriptを出力する形となってしまい, コードが煩雑になってしまう恐れがあるのです。 煩雑になればなるほどバグは生みやすくなるだろうと思っているので このパターンは個人的に避けたいと考えているんです。 何が悪いか最初にもどって考えてみたら,CDATA区間のことを考えていることであって, Ecmascriptを外部のファイルにしてしまえば, suzuki-_-さんが示してくれた置換をするだけで正常に動く・・・と思います。 #これの欠点はファイルが複数になり,持ち運びわすれが発生する可能性がある点。 #「zipファイル等に纏め,後で解凍する」以外の解決方法の一つとしてbase64を用いてdata URIで表現したデータを XHTMLのscript要素のsrc属性にしていする手があるけど,修正が面倒くさくなりそうだ・・・・

関連するQ&A

専門家に質問してみよう