我做了什么:
我创建了一个带有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(文件:/// C:/ workspace / xss test / index.html),单击按钮后会得到以下响应:
> Firefox:没有错误代码(HTTP / 1.1 200 OK),但答案是空的
> IE:没有答案
> Chrome:
XMLHttpRequest无法加载http://www.example.com/. Access-Control-Allow-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;博士 – 问题:
为什么可以将内容从远程服务器加载到我的移动设备 – 这不是跨域脚本的情况,还是我错过了什么?
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.
提前致谢.
解决方法:
实际上,您的代码在移动浏览器上失败,包括Android上的ICS和Chrome以及iPhone上的Safari.但是,你所展示的并不是在浏览器中加载html文件 – 它将它加载到WebView中 – 一个完全不同的动物.
WebView或Webkit只是一个实现类似浏览器功能的UI小部件.它们不是浏览器.它们不提供像通常的浏览器chrome那样的东西,默认情况下它们与浏览器相比具有非常宽松的安全模型.但是,如果需要,您可以添加代码来实现同源策略等.
它不仅适用于移动设备.尝试在桌面上创建一个Webkit应用程序,你会看到同样的事情.
我相信这样做的原因是假设WebViews和Webkits用于显示您100%控制的内容.与用户可以在地址栏中输入任何URL的浏览器不同.因此,您可以自行查看您正在装载的物品是否安全.