どもです。
とある旧いWebシステムのアップデートを行いました。
どれくらい旧いかといえば、推奨環境がIE5~8という旧さです。
で、アップデートの直後、窓口の方から「ボタンを押したらエラーになった!」と報告があったのですが、詳しく状況を伺うと推奨環境のIEでなくGoogleChromeでアクセスしていること、そもそも今回アップデートした箇所とは無関係であることがわかりました。ヲイ。
で、肝心の何がエラーを起こしていたのか、ですが。
これでした。
正確には、これを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&=2 | ?p1=1&=2 | ?p1=1&=2 |
script | ?p1=1&=2 | ?p1=1&=2 | ?p1=1&=2 |
!!!!???(´゚д゚`)
いや明らかにおかしいのが無いかなあ!!?
なんでセミコロン無しにエスケープとして認識されちゃってるワケぇ!?
「&」の後の渡すパラメータがhtmlエスケープと一致してしまう場合、IEでは予期せぬエスケープが発生してしまうんですね。
これを防ぐために「&」をエスケープする必要がある、と。
しかしモダンブラウザではjs内ではhtmlエスケープを行わないので、ブラウザで分岐でもしなければ、どちらかでバグることになるようです。
まあ、今どきIEなんてシステム以外で使うことはないので、どちらかに合わせておけば良いのでしょうけど…
ないよね??