読者です 読者をやめる 読者になる 読者になる

window.name

スポンサーリンク

このままだとwindow.nameが可愛そうな気がしたので、出来る限りのフォローを。(コメントだと書ききれないので、エントリにさせていただきました)

window.name(グローバルなスコープだとthis.nameも同じ)は、名前のとおりそのままウインドウの名前を表すものであり、ページ遷移したとしてもウインドウ自体が変わるものではないので、クリアされないことに(今は)違和感はありません。(初めて知ったときはびっくりしました)
逆にクリアされてしまったら、何かと弊害がありそうな気がしてます。


まず、、window.nameは、どういったときに設定されるかっていうと、アンカーやフォームでtargetを指定してURLを開くと、開いたウインドウのwindow.nameはtargetで指定した名前が設定されます。(ただし、_blank を指定するとwindow.nameは空となる)
なお、targetを指定してウインドウを開いた場合に、既にその名前がwindow.nameに設定されたウインドウがあれば、そのウインドウに対して開かれ、無ければ新たにその名前でウインドウが開かれるといった感じです。
あとは、iframeだと、nameで指定した名前がそのままiframe内で開いたウインドウのwindow.nameになります。

<!--
 既にwindow.nameが"win1"のウインドウがあれば、そのウインドウで指定したURLが開かれる。
 なければ新たにwindow.nameが"win1"になるウインドウが開かれる。
 -->
<a href="./hoge.html" target="win1">win1</a>

<!--
 iframe は nameに指定したものがwindow.nameとなるので、下記のsubmitを押下すると
 iframe内に開かれる。
 -->
<form target="win2" action="./hoge.html">
  <input type="submit" value="開く"/>
</form>
<iframe name="win2" />

画面遷移してwindow.nameがクリアされてしまったら、次に同じウインドウで画面を開こうとした場合に、targetで指定した名前とリンクするwindow.nameが無いので、また新しいウインドウで開くことになってしまいます。
ちなみにwindow.nameはJavaScriptで変更可能であり、もともとtargetで開かれたウインドウじゃなくてもウインドウ名を指定することが可能です。


window.nameの可能性として、、CookieだとURLに対して同じCookieが共用されてしまいますが、window.nameを使えばウインドウ毎に任意の情報を持つことが出来るので、なんかに利用できそうな気がしています。
WEBアプリケーションのセッション情報を、Cookieだけじゃなくて、Cookie+window.nameでやると、複数ウインドウを同時に操作してもセッションがおかしくなるって事がなくてよいかも。けどwindow.nameをいちいちサーバに送る手間もあるので、その辺の工数とのトレードオフかなぁと思ってます。

ただし、window.nameにユーザの情報を入れてしまうと、その情報を抜かれる可能性があるので、window.nameを使う場合にその辺を考えた上で使う必要があります。
例えば、window.nameにログインID:パスワードを入れるようなアプリケーションがあって、そのサイトから、window.nameを抜くようなページにリンクが張られてしまうと、ログインID:パスワードが抜かれ放題になるので。まぁ、極端な例ですが…
この場合、window.nameに脆弱性があるわけではなく、そのような情報を設定してしまうアプリケーション自体に問題があると思います。
また、不正なスクリプトを埋め込まれてwindow.nameにCookieを設定っていうのも、不正なスクリプトを埋め込めるならば、わざわざwindow.nameにCookieを設定し、別のページに遷移させるっていう手間をとることなく、scriptやimgタグつかってsrcで指定するURL(情報を収集するためのサイト)のクエリにCookieをURLエンコーディングしたものをくっつけて送りつけてしまえば簡単だと思います。(この場合も不正なスクリプトを埋め込み可能なサイト自体の脆弱性)


ということで、window.name自体がセキュリティ的に問題があるってことはまったく無いのかなーと思ってます。