javascript - 为什么移动设备上的本地文件可以跨域脚本?

标签 javascript android ajax mobile 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>

和我的 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:没有回答

  • Chrome: XMLHttpRequest 无法加载 http://www.example.com/。 Access-Control-Allow-Origin 不允许 Origin null。

  • 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");
    }
}

调用成功回调并在触发按钮后在我的 index.html 文件正文中显示 www.example.com 的内容。

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

tl;dr - 问题:

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

Due to browser security restrictions, most "Ajax" requests are subject to the same origin policy; the request can not successfully retrieve data from a different domain, subdomain, or protocol.

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

提前致谢。

最佳答案

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

WebView 或 Webkit 只是一个实现类似浏览器功能的 UI 小部件。它们不是浏览器。他们不提供像通常的浏览器 chrome 这样的东西,并且与浏览器相比,他们默认具有非常自由的安全模型。不过,如果需要,您可以添加代码来实现同源策略等。

它不仅在移动设备上。尝试在桌面上创建一个 Webkit 应用程序,您会看到同样的结果。

我认为这是因为 WebView 和 Webkit 被假定用于显示您 100% 控制的内容。与用户可以在地址栏中输入任何 URL 的浏览器不同。因此,由您来检查您装载的元素是否安全。

关于javascript - 为什么移动设备上的本地文件可以跨域脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422401/

相关文章:

javascript - 替换 Javascript 字符串中的双引号和单引号

javascript - 在大屏幕上将 n-div 并排放置,在小屏幕上将一个放置在彼此下方

android - 无法在 Android 10 上读取缩略图 (loadThumbnail)

javascript - liferay设置liferay-ui的id为:search-container-row

javascript - 如何从具有值的 JSON 对象中获取索引?

java - 在 Android 中测试 P2P 应用程序的最佳方法是什么?

java - Java中的Opencv SVM无法正确训练

javascript - D3.json 设置缓存为 false

ajax - Twitter 新推文功能?

javascript - ASP MVC 基本 AJAX Json 请求返回 null