32979


**`<script src="ファイル名"></script>`でPHPファイルを指定した時の挙動は何に基づくのでしょうか？**  
・何の仕様を確認すれば良いでしょうか？  
・PHP？  
・ECMASCRIPT？  
・HTML5？

* * *

**疑問点**

・拡張子がPHPファイルなので、PHPファイルが動作するのは分かるのですが、`<script src>`で指定したphpファイルに
`header("Content-type:
application/javascript");`を付与しなくてもjavaScriptが動作するのは何故でしょうか？  
・`<script src>`で指定したから？  
・そもそも、どうしてPHPファイルを指定できるのか、よく分かりません


CC BY-SA 3.0
2017-02-27T10:13:21.083
32976
2017-03-20T14:18:30.190
7886
question
javascript php
<script src="ファイル名"></script>でPHPファイルを指定した時の挙動は何に基づくのでしょうか？


[HTML5から`type`のデフォルトは`text/javascript`](https://www.w3.org/TR/html5/scripting-1.html#attr-
script-
type)なので、何も指定しない場合JSとして処理されます。また現状JS以外にブラウザが処理できるスクリプトはないので、`type`を何かJS以外に指定した場合、タグの中身は無視されます（DOMにテキストとしては存在する）。

タイプの判断は`type`属性だけ考慮されるので、HTTPのヘッダーをPHPで指定する必要もありませんし、しても無視されます。

`<script>`で`src`を指定した場合起こるのは、そのファイルを取得して、`charset`でファイルのバイトを文字化して、`<script>`と`</script>`の中に展開、です。そのあとはインラインだった場合と同じようにスクリプトが実行されるので、何かしらファイルを取得できるアドレスであれば`src`は何でも良いのです。動画でも、exeでも、何でも指定はできます。ただその場合ダウンロードはされますが、テキストデータではないので、charsetに含まれないバイト列にぶつかった段階でエラーを吐いて、そのタグに関する処理終わります。


CC BY-SA 3.0
2017-02-27T13:17:54.563
32979
2017-02-27T13:17:54.563
3974
32976
answer


packet0さんの指摘の通り、<script src=…>で指定したコンテンツのContent-
Typeがtext/javascriptでなくてもJavaSriptとして実行されますが、それでも text/javascrpt を指定することを
**強く推奨** します。それはセキュリティ上の理由からです。

<script src...>に動的コンテンツを指定する典型例として JSONP があります。JSONPのContent-
Typeはtext/javascriptが正ですが、text/htmlを指定していると、クロスサイトスクリプティング(XSS)となる場合があります。例えば、JSONPとして返送されるコールバック関数が下記だったとします。

[code]

    callback(['<img src=# onerror=alert(1)>'])
    
[/code]

これを返すPHPのURLをアドレスバーに指定して直接実行した場合を考えます。

Content-Type: text/html の場合 alert(1) が実行される  
Content-Type: text/javascript の場合 そのまま表示される

このように、JavaScriptの中に、HTMLタグがあり、JavaScriptを実行する形になっていると、XSS脆弱性になる場合があります。

加えて、目的外の呼び出し方を防ぐことをさらに確実にするためのレスポンスヘッダとして下記があります。元々はMicrosoftが提唱したものですが、現在は主要ブラウザで有効です。

[code]

    X-Content-Type-Options: nosniff
    
[/code]

これを指定しておくと、text/htmlやapplication/jsonのコンテンツを <sciprt src=...に読ませると、エラーになります。

まとめると以下です。

  * Content-Typeは正確に指定することが望ましい
  * それにより、想定外の呼び出し方によりXSS脆弱性となることを防止する効果がある
  * Content-Typeを厳密に解釈させるためのレスポンスヘッダとして、X-Content-Type-Options: nosniff がある
  * X-Content-Type-Options: nosniff を指定した場合、<script src=... にtext/javascript以外のコンテンツを指定するとエラーになる。これはセキュリティ上の理由による


CC BY-SA 3.0
2017-03-20T14:18:30.190
33431
2017-03-20T14:18:30.190
781
32976
answer