4

私がしたこと:

jQuery.get()関数を呼び出すxss.jsを使用してindex.htmlを作成しました。次に、ブラウザ(Firefox、Chrome、IE、Opera)でindex.htmlを開き、ajaxリクエストをトリガーしようとしました。

コード

これが私のindex.htmlです:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>XSS</title>
        <script src="libs/js/jquery-1.7.2.js" ></script>
    </head>
    <body>
        <button id="request" >fire</button>
        <script src="libs/js/xss.js" ></script>
    </body>
</html>

と私のxss.js:

function init()
{
    $('#request').click(loadContent);
}

function loadContent()
{
    $.get('http://www.example.com/', null, function(data){
        alert('success');            
        $('body').html(data);            
    }, 'html');

}

init();

index.htmlブラウザ()内で開くとfile:///C:/workspace/xss%20test/index.html、ボタンをクリックすると次の応答が返されます。

  • Firefox:エラーコード(HTTP/1.1 200 OK)はありませんが、答えは空です

  • IE:無回答

  • ChromeXMLHttpRequest cannot load http://www.example.com/. Origin null is not allowed by Access-Control-Allow-Origin.

  • Opera:エラーコード(HTTP/1.1 200 OK)はなく、完全なhtmlファイルが回答として表示されますが、何も表示されません(成功コールバックはトリガーされません)

このコードはindex.html私のAndroidWebViewにロードされます:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webview = (WebView) findViewById(R.id.webview);

        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new WebChromeClient());
        webview.setWebViewClient(new WebViewClient());

        webview.loadUrl("file:///android_asset/www/index.html");
    }
}

ボタンがトリガーされた後、成功コールバックを呼び出し、ファイルwww.example.comの本文にの内容も表示します。index.html

(iPhoneデバイスでも同じことが可能です。これはWindows Phoneデバイスではテストしていません)

tl; dr-質問:

リモートサーバーからモバイルデバイスにコンテンツをロードできるのはなぜですか?これはクロスドメインスクリプティングの場合ではないのですか、それとも何かが足りないのですか?

ブラウザのセキュリティ制限により、ほとんどの「Ajax」リクエストには同一生成元ポリシーが適用されます。リクエストは、別のドメイン、サブドメイン、またはプロトコルからデータを正常に取得できません。

また、Operaが回答を受け取っても何も表示されないのはなぜですか?

前もって感謝します。

4

1 に答える 1

6

実際、あなたのコードは、Android の ICS や Chrome、iPhone の Safari などのモバイル ブラウザーでは失敗します。ただし、あなたが示したのは、ブラウザにhtmlファイルをロードすることではありません.WebViewにロードすることです.まったく別の動物です.

WebView または Webkit は、ブラウザーのような機能を実装する単なる UI ウィジェットです。それらはブラウザではありません。通常のブラウザー chrome のようなものは提供せず、ブラウザーに比べてデフォルトで非常に自由度の高いセキュリティ モデルを備えています。ただし、必要に応じて、same-origin-policy などを実装するコードを追加できます。

モバイルデバイスだけではありません。デスクトップで Webkit アプリを作成してみてください。同じ結果が得られます。

この理由は、WebView と Webkit は、100% コントロールできるコンテンツを表示するために使用されると想定されているためだと思います。ユーザーがアドレスバーに任意の URL を入力できるブラウザーとは異なります。したがって、積み込んでいる物が安全かどうかを調べるのはあなた次第です。

于 2012-11-16T19:16:52.420 に答える