为什么移动设备上的本地文件可以使用跨域脚本



我做了什么:

我用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>

和我的xs.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:无应答

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

调用success回调,并在触发按钮后在我的index.html文件的主体中显示www.example.com的内容。

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

tl;dr-问题:

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

由于浏览器安全限制,大多数"Ajax"请求都受到同源策略的约束;请求无法从其他域、子域或协议成功检索数据。

还有:为什么Opera会收到答案,但什么都不显示?

提前谢谢。

实际上,您的代码在移动浏览器上失败,包括Android上的ICS和Chrome,以及iPhone上的Safari。然而,您所展示的并不是在浏览器中加载html文件,而是将其加载到WebView中,这完全是一种不同的动物。

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

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

我相信这是因为WebViews和Webkit被假设用于显示您100%控制的内容。不同于浏览器,用户可以在地址栏中输入任何URL。因此,这取决于你是否检查你装载的东西是否安全。

相关内容

  • 没有找到相关文章

最新更新