ど素人から毛を生やす。<延>

ダブランとTRPGを愛する、いわゆる「紙一重」の元web会社員が、
夢を叶えようとしたり趣味にいそしんだりする場末のブログ。

HN 餅。
好きなポケモン ダブラン・バタフリーたん・リザードン先輩・ピンクの悪魔ラッキー

scriptタグの中のURLはHTMLエスケープしちゃダメ…のはずが。

Web > javascript 2019年6月19日

どもです。

とある旧いWebシステムのアップデートを行いました。
どれくらい旧いかといえば、推奨環境がIE5~8という旧さです。

で、アップデートの直後、窓口の方から「ボタンを押したらエラーになった!」と報告があったのですが、詳しく状況を伺うと推奨環境のIEでなくGoogleChromeでアクセスしていること、そもそも今回アップデートした箇所とは無関係であることがわかりました。ヲイ。

で、肝心の何がエラーを起こしていたのか、ですが。

window.open("xxx.php?para1=1&pra2=2");

これでした。

正確には、これをjsファイルの中で書いたことでした。

確かにURLの「&」を「&」で書くことは推奨されていますが、これはあくまでhtml中の場合です。

jsファイルは当然、srciptタグの中もjsのルールで動きます。
そしてjsとhtmlではエスケープコードが違います!

しかしIEにはsrciptタグやjsファイルのURL中の「&」をHTMLエスケープするという謎仕様があります。
この仕様によって、今までこの問題が発覚しなかったというのです。

検証

記述位置 内容 IE Chrome,FF
html ?p1=1&p2=2 ?p1=1&p2=2 ?p1=1&p2=2
html ?p1=1&p2=2 ?p1=1&p2=2 ?p1=1&p2=2
script ?p1=1&p2=2 ?p1=1&p2=2 ?p1=1&p2=2
script ?p1=1&p2=2 ?p1=1&p2=2 ?p1=1&p2=2
html ?p1=1&amp=2 ?p1=1&amp=2 ?p1=1&amp=2
script ?p1=1&amp=2 ?p1=1&=2 ?p1=1&amp=2

!!!!???(´゚д゚`)

いや明らかにおかしいのが無いかなあ!!?
なんでセミコロン無しにエスケープとして認識されちゃってるワケぇ!?

「&」の後の渡すパラメータがhtmlエスケープと一致してしまう場合、IEでは予期せぬエスケープが発生してしまうんですね。
これを防ぐために「&」をエスケープする必要がある、と。
しかしモダンブラウザではjs内ではhtmlエスケープを行わないので、ブラウザで分岐でもしなければ、どちらかでバグることになるようです。

まあ、今どきIEなんてシステム以外で使うことはないので、どちらかに合わせておけば良いのでしょうけど…

ないよね??

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)