Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work with X-Frame-Options:deny on Chrome #3

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

YungSang
Copy link

Chrome 26 で
「Refused to display 'http://www.tumblr.com/dashboard/3/48859274965' in a frame because it set 'X-Frame-Options' to 'deny'. 」
のエラーで読み込みが出来なくなっていました。
XMLHttpRequest を使って読みこむように変更しました。
createHTMLDocumentByString() を使っても上手くいかなかったので、
Taberareloo から createHTML() を持って来ました。

強引な感じでコードを汚してしまって申し訳ありません。
適宜見直して頂けると幸いです。
よろしくお願いします。

@swdyh
Copy link
Owner

swdyh commented May 2, 2013

パッチありがとうございます。このパッチでこのエラーは解消されるので適用したいんですが、別の事情があるので保留させてください。

別の事情というのは、AutoPagerizeの要件としてクロスオリジンからデータを取得した合に処理を止める必要があるんですが、XHRだとリダイレクトを経由したときにそれを判別できないという問題があります。
この問題は根が深くてややこしいんですが、将来的には解決する可能性はあるのでそれを待ちながらしばらくはiframeを使う予定でいます。

@YungSang
Copy link
Author

YungSang commented May 2, 2013

なるほど。そういう要件があったのですね。
もしかしたら、webRequestBlocking の onBeforeRedirect と onBeforeRequest でブロック出来たら良さそうですね。
http://developer.chrome.com/extensions/webRequest.html

@YungSang
Copy link
Author

YungSang commented May 2, 2013

あれ? manifest.json の permissions に http://wedata.net/* しか書かれてないので、実質クロスドメインは出来ないんじゃないですか?

@YungSang
Copy link
Author

YungSang commented May 2, 2013

req.responseType = 'document' を使うことによって、document オブジェクトを取得すると同時に、最終のドキュメントのURLがとれるのでそれでドメインのチェックが出来るようになったと思います。
Taberareloo からのコードも要らなくなり、コードもスッキリしました。
よろしくお願いします。

@YungSang
Copy link
Author

YungSang commented May 2, 2013

あああ、すみません。余計なコメントをあっちでしてしまいました。。

@syoichi
Copy link

syoichi commented May 2, 2013

@YungSang
現在のChromeでは状況が異なるかもしれませんが、この問題に関しては以下の議論や@xKermanさんのポストが参考になるかもしれません。
swdyh/autopagerize_for_firefox#7
http://xkansan.tumblr.com/post/17767109559/xhr-redirect-same-origin-to-cross-origin
http://xkansan.tumblr.com/post/19043957246/xhr-finalurl-for-chrome-extension

@YungSang
Copy link
Author

YungSang commented May 2, 2013

ありがとうございます。はい、私もそれを読んで、req.responseType = 'document' を試してみたところ良い感じだったので、再PRしてみました。

@swdyh
Copy link
Owner

swdyh commented May 3, 2013

アクセス先がAccess-Control-Allow-Originヘッダーでクロスオリジンのアクセスを許可している場合は、permissionと関係なくアクセスできるので、そういうケースを想定しています。

将来的に解決する可能性と書いたのは、documentTypeでdocumentを指定してresponse.URLを見る方法なんですが、実装に不備があるので採用していませんでした。

現状のChromeは、クロスオリジンへのリダイレクトはエラーになります。エラーになるのは都合が良いのですが、エラーになる理由がわかりません。CORSの仕様にリダイレクトでエラーにするということはなく、FirefoxやIEではエラーになりません。今後のアップデートでエラーが出なくなったとしても安全にできるということが必要だと思っています。

エラーがでなくなったとしてもresponse.URLをチェックしておけばいい、という手も考えられるんですが、現在のChromeは、セイムオリジンへリダイレクトしたときのresponse.URLはリダイレクト前のものを返していて、これと同じようになるとまずいです。クロスオリジンへのリダイレクトのエラーがなくなって、かつ、response.URLがリダイレクト後のURLを返すことが確認できたら、XHRを使って良いんじゃないかと考えています。

webRequestでやるのは考えたことがなかったです。こっちでいけるかもしれないですね、調べてみます。

リダイレクトとCORSとresponseTypeのdocument指定を組み合わせて実行するページを置きました。
http://autopagerize.net/cors.html

@YungSang
Copy link
Author

YungSang commented May 3, 2013

何度もすみません。単純な話でなかったんですね。
いろいろご説明ありがとうございました。

@swdyh
Copy link
Owner

swdyh commented May 5, 2013

リダイレクトとresponse.URLがちゃんと機能していれば単純な話だったですけどね。

webRequestの方を調べてみたらブロックできそうでした。ありがとうございます。
permissionsにhttp://_/やhttps:///_を追加しないといけないのと、エラーがなくならないと実際にブロックが機能するかを試せないのが難点で、もう少し様子見しようと思います。

@YungSang
Copy link
Author

YungSang commented May 6, 2013

permissionsにhttp:///やhttps:/// を追加するとエラーが無くなったりしませんかね?
どちらにしても Background でやらないとダメかも知れませんね。
よろしくお願いします。

@swdyh
Copy link
Owner

swdyh commented May 8, 2013

permissions足せばエラー消えますね。
content scriptでもbackgroundと同じようにpermissionが適用されたXHRが使えます。

webRequestでクロスオリジンアクセスをブロックするバージョンを作りました。
セキュリティに影響する変更なので、もう少し考えた上でマージするか決めようと思っています。

master...xhr_with_webRequest

@YungSang
Copy link
Author

YungSang commented May 9, 2013

ありがとうございます。実装が素晴らしいですね。こちらでも試させてもらいますー

@xKerman
Copy link
Contributor

xKerman commented Sep 13, 2014

req.responseType = 'document' を使うことによって、document オブジェクトを取得すると同時に、最終のドキュメントのURLがとれる

についてはドキュメントのURLの部分がまだ実装されていない (https://code.google.com/p/chromium/issues/detail?id=379676) ため利用できませんが、
今のstable (Chrome 37) から XMLHttpRequest.prototype.resopnseURL という、 finalURL の代わりに使えるプロパティが利用できるようになっています。
https://code.google.com/p/chromium/issues/detail?id=377583

このプロパティを使うと、下記のように実装できて X-Frame-Options: deny なページでも動作するようになるかと思います。
xKerman@77c04e7

@swdyh
Copy link
Owner

swdyh commented Sep 15, 2014

@xKerman Chromeもリリース版でresponseURL使えるんですね。素晴らしいです。
Chrome Web Storeはバージョンの統計情報がとれないみたいで、どのバージョンが使われているかはわからないんですが、互換性を考えつつresponseURLを使うようにしようと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants