为什么移动设备上的本地文件可以进行跨域脚本编写?

Tob*_*ich 4 javascript ajax mobile android cross-domain

我做了什么:

我创建了一个带有xss.js的index.html,它调用了jQuery.get()函数.然后我在浏览器(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>
Run Code Online (Sandbox Code Playgroud)

和我的xss.js:

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

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

}

init();
Run Code Online (Sandbox Code Playgroud)

如果我index.html在浏览器中打开(file:///C:/workspace/xss%20test/index.html),单击按钮后会收到以下响应:

  • Firefox:没有错误代码(HTTP/1.1 200 OK),但答案是空的

  • IE:没有答案

  • Chrome: XMLHttpRequest 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到我的Android WebView中:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用成功回调,并www.example.comindex.html触发按钮后显示文件正文中的内容.

(在iPhone设备上也是如此 - 我还没有在Windows Phone设备上测试过这个).

tl;博士 - 问题:

为什么可以将内容从远程服务器加载到我的移动设备 - 这不是跨域脚本的情况,还是我错过了什么?

由于浏览器安全限制,大多数"Ajax"请求都遵循相同的原始策略; 请求无法从其他域,子域或协议成功检索数据.

另外:为什么Opera会收到答案但没有显示任何内容?

提前致谢.

sle*_*man 6

实际上,您的代码在移动浏览器上失败,包括Android上的ICS和Chrome以及iPhone上的Safari.但是,你所展示的并不是在浏览器中加载html文件 - 它将它加载到WebView中 - 一个完全不同的动物.

WebView或Webkit只是一个实现类似浏览器功能的UI小部件.它们不是浏览器.它们不提供像通常的浏览器chrome那样的东西,默认情况下它们与浏览器相比具有非常宽松的安全模型.但是,如果需要,您可以添加代码来实现同源策略等.

它不仅适用于移动设备.尝试在桌面上创建一个Webkit应用程序,你会看到同样的事情.

我相信这样做的原因是假设WebViews和Webkits用于显示您100%控制的内容.与用户可以在地址栏中输入任何URL的浏览器不同.因此,您可以自行查看您正在装载的物品是否安全.