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

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

Web > javascript 2019年6月19日(最終更新:4年前)

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
script ?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
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)