`
Kenny.Lee
  • 浏览: 515696 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JavaScript(XMLHttpRequest)跨域访问解决办法及安全性问题(附上proxy)

阅读更多
关于具体的JavaScript安全机制,推荐请查看《JavaScript.The.Definitive.Guide.5th.Edition》。

网上解决跨域问题的文章不少,但都笼统的说了一下“因为JavaScript的安全框架”直接就跳过原因了,本着寻根问底的心态钻研了下。

关于JavaScript的安全性请记住一下几点,是简短的从《JavaScript.The.Definitive.Guide.5th.Edition》(我叫她"大犀牛")转述一下...注意不同浏览器也有不同限制:

   1. JavaScript不能增删改查用户客户端的任何数据。

   2. 无法打开socket或者接受其他主机请求。

     注:如果没有了上面两条的话,网络变成什么世界就无法想象了。

   3. 新建窗口事件只有在用户鼠标点击事件才能触发。

   4. 鼠标移动到连接地址时,状态栏要显示确切地址。

      这个几年前比较常常看到的网页特效,在状态栏写着日期或者"欢迎之类",其实这样的后果是访问者无法查看当前鼠标停放的url的地址。有可能造成触碰到钓鱼陷阱。

   5. 无法打开边距小于100像素的窗口。

   6. fileupload属性value值无法设置。
      也许这个不好理解,但是如果可以设置的话,将有可能造成把你的某指定文件上传到服务器的后果。

   7. 同源策略(The Same-Origin Policy)注意对于cookie也同样适用。


关于JavaScript跨站访问(Cross-Site)

跨域访问的问题在于第7点,首先理解脚本本身的来源与同源策略不相关。即B域调用A域的脚本(通过script的src),可以完全的访问B域的文档内容。但如果访问A域或者C域的话同源策略就发挥作用。


同源指的是:同协议同域名并且同端口。缺一不可


    某些情况下,同源策略会显得太严谨了。但在安全性的前提下,我们还是可以有解决办法的。这些解决办法跟安全性框架没任何冲突,除非它是浏览器的一个漏洞。

1、主域相同,子域之间的访问。

使用document的domain属性,默认情况下存放装载文档的服务器主机名。

例如,现在两个域,home.example.com和developer.example.com。

这两个域之间想互相装载文档属性的话是完全符合需求的,可以把document.domain属性设置为"example.com"。另注意domain的值至少要有一个点号。

此时文档就有同源性可以互相访问了。


2、主域不相同。

目前有两种解决办法,但是归根到底还是通过proxy实现。


proxy的作用:

proxy位于文档本域,作用是用来访问远程的资源并且返回给JavaScript。


一、使用AJAX XMLHttpRequest.

使用JavaScript构造XMLHttpRequest请求然后通过proxy获取资源。


二、使用script标签.

通过使用script标签设置src为proxy获取资源,然后可以得到得到远程数据。

其实以上两种解决办法还是基于“发送请求的操作然后获取服务端的数据”。比较推荐使用AJAX,但直接使用script标记的话会很方便,并且门槛应该相对低点。

另,还有一些是关于iframe的解决办法和情况没考虑,但暂时没遇到,先不考虑了,而且觉得情景也比较少。

附上java写的Proxy代码(jsp)
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.Map,java.util.HashMap,java.util.Enumeration"%>
<%--
/**
 * 为解决JavaScript跨域访问资源时,遇到因同源策略而造成访问资源失败的问题。
 * (而实际上,使用AJAX的XMLHttpRequest时碰到这种情况的几率居多。)
 *
 * 使用此代理可以实现请求转发:
 * 		把跨域的资源信息获取回本域,然后再把该信息响应给本域提交请求的对象。
 *
 * 中文编码问题: 跨域资源返回时都做了decode操作,默认UTF8编码。
 *
 * 参数问题: 访问此代理的参数中必须含有url的参数,作为跨域访问的目标url对象。
 *          除了url参数外的其他参数,将生成为跨域访问时目标url的参数,共同转发过去。
 *
 * @author KennyLee E-mail:kennylee26@gmail.com 2009-2-25
 * 
 */
 --%>
<%
	String url = null;
	Map<String, String> req_map = new HashMap<String, String>();
	Enumeration<?> _enum = request.getParameterNames();
	while (_enum.hasMoreElements()) {
		String paramName = (String) _enum.nextElement();
		String paramValue = request.getParameter(paramName);
		req_map.put(paramName, paramValue);
	}
	if (!req_map.isEmpty())
		url = req_map.remove("url");
	if ((url != null) && (url.length() > 0)) {
		if (!req_map.isEmpty()) {
			StringBuffer url_sbf = new StringBuffer(url);
			for (Map.Entry<String, String> entry : req_map.entrySet()) {//generate parameters
				String _par_key = entry.getKey();
				String _par_value = entry.getValue();
				if (_par_key != null && _par_key != "") {
					if (url_sbf.indexOf("?") == -1)
						url_sbf.append("?");
					else
						url_sbf.append("&");
					url_sbf.append(_par_key).append("=").append(
							_par_value);
				}
			}
			url = url_sbf.toString();
		}
		java.net.URL _url = new java.net.URL(url);
		java.net.URLConnection urlcon = _url.openConnection();
		java.io.InputStream is = urlcon.getInputStream();
		java.io.BufferedReader buffer = new java.io.BufferedReader(
				new java.io.InputStreamReader(is));
		StringBuffer bs = new StringBuffer();
		String lineStr = null;
		while ((lineStr = buffer.readLine()) != null) {
			String stri = java.net.URLDecoder.decode(lineStr, "UTF-8");
			bs.append(stri).append("\n");
		}
		if (bs.toString().indexOf("<?xml version=") != -1) {//if XML file, for AJAX
			response.setContentType("text/xml; charset=UTF-8");
			response.setHeader("Cache-Control", "no-cache");
			out.println(bs.toString());
		} else
			out.println(bs.toString());
	}
%>

分享到:
评论

相关推荐

    解决openlayers跨域访问的解决方案

    下面将详细介绍如何解决OpenLayers中的跨域问题。 ### 一、理解同源策略 同源策略是Web浏览器的一项安全措施,它限制了来自不同源(协议、域名、端口)的脚本之间共享资源。例如,一个运行在http://example.com上...

    JS跨域访问解决方案总结[参照].pdf

    Web2.0 和 SNS 的兴起,Web 应用对跨域访问的需求也越来越多,为此 W3C 工作组中的 Web Applications Working Group 发布了一个 Cross-Origin Resource Sharing(跨域资源共享规范)推荐规范来解决跨域请求的问题。...

    Javascript跨域和Ajax跨域解决方案

    首先,理解同源策略是解决跨域问题的基础。同源策略是浏览器为了保障用户安全而设定的一种机制,它规定了只有同源(即协议、域名和端口都相同)的网页才能互相访问对方的资源。如果违反这一策略,浏览器会阻止请求,...

    ajax跨域问题的解决办法

    ajax跨域问题的解决办法 ajax跨域问题是指在使用ajax技术时遇到的跨域限制问题,即ajax请求不能跨域访问其他域的服务器资源。这种限制是由于浏览器的同源策略所引起的,同源策略规定一个域下的脚本只能访问该域下的...

    JS跨域访问解决方案总结.pdf

    描述部分未提供具体内容,但根据标题可以推断文档将提供一系列的解决跨域问题的技术方案。 从提供的部分内容来看,文档涉及到以下几个关键知识点: 1. 同源策略(Sameorigin policy):这是浏览器实施的一种安全...

    xmlhttp跨域解决方案

    总之,通过代理服务器解决XMLHttpRequest的跨域问题是一种常见且有效的方法。它需要在服务器端进行适当的配置和编程,以转发请求并处理响应,同时注意安全性的保障。对于Java开发者来说,掌握Spring MVC或其他相关...

    JavaScript解决跨域滚动条

    在本例中,"JavaScript解决跨域滚动条"的问题,指的是当主程序和子程序页面位于不同的源下,导致主程序无法获取子程序页面的尺寸,从而引发双滚动条的显示。 为了解决这个问题,我们可以利用JavaScript中的两种主要...

    JS跨域访问解决方案总结

    CORS作为跨域资源共享的标准,极大地提高了Web应用的安全性和灵活性。通过合理配置HTTP头部信息,开发者可以在确保安全的同时,实现高效的数据交换和功能集成。随着技术的发展,CORS将继续发挥重要作用,推动Web应用...

    JavaScript 跨域通信方法

    ### JavaScript父子页面跨域通信详解 #### 一、引言 在现代Web开发中,跨域通信是一个常见的问题。由于浏览器的安全策略——同源...开发者可以根据实际情况选择最合适的技术方案,以确保Web应用的安全性和功能性。

    ASP.NET后台代码实现XmlHttp跨域访问

    当客户端尝试从一个源加载不同源的数据时,就会触发跨域问题。为了解决这个问题,开发者通常会采用多种技术手段,其中一种是通过ASP.NET后台代码实现XmlHttp跨域访问。本文将详细介绍如何在ASP.NET应用中实现XmlHttp...

    js跨域问题解决方案.

    JavaScript跨域问题,是Web开发中常见的一个挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源的资源,这在实现某些功能时会带来不便。本文将深入探讨JavaScript跨域问题的原因、影响以及多种解决方案...

    js 跨域解决方案

    本文将深入探讨JavaScript跨域问题及其解决方案,以帮助开发者理解和应对这一问题。 首先,了解同源策略是解决问题的关键。同源策略是浏览器为了保障用户数据安全而实施的一种机制,它禁止了一个源的文档或脚本获取...

    Ajax跨域问题及其解决方案.docx

    ### Ajax跨域问题及其解决...总之,跨域问题是Web开发中常见的问题,解决这一问题的方法多样,但在选择解决方案时应考虑其适用性和安全性。CORS是最推荐的方法,因为它既符合现代Web标准,又能较好地平衡功能与安全性。

    Openfire strophejs 跨域访问

    解决Openfire和Strophe.js的跨域问题,主要是为了克服浏览器的同源策略。同源策略是浏览器为了安全而设定的一种机制,它阻止了一个源(协议+域名+端口)的文档或脚本获取或操作另一个源的资源。在Openfire与Strophe....

    javascript解决浏览器兼容性问题

    本文将详细介绍如何使用JavaScript解决浏览器兼容性问题,特别是针对XMLHttpRequest对象的创建及对不同版本IE浏览器的识别。 #### 二、XMLHttpRequest对象的兼容性创建 XMLHttpRequest对象是用于执行异步请求的...

    有关Ajax跨域问题的两种解决方法

    Ajax跨域是前端开发中常见的问题,本文描述了以Google浏览器Chrome作为客户端和以Tomcat作为Web服务器的情况下的解决办法。 问题现象 当出现跨域访问的时候ajax通常会报类似如下错误: XMLHttpRequest cannot load ...

    Ajax跨域问题 解决方案

    ### Ajax跨域问题解决方案 #### 一、什么是Ajax跨域 **原理:** Ajax跨域问题的核心在于浏览器的“同源策略”。同源策略是一种安全措施,用于限制一个域名下的文档或脚本如何与另一个来源的资源进行交互。简单来说...

    详解JavaScript跨域总结与解决办法

    针对跨域问题,前端开发中常见的解决办法有: 1. **JSONP(JSON with Padding)**:JSONP利用的是`&lt;script&gt;`标签不受同源策略限制的特点,通过动态创建`&lt;script&gt;`标签并指定`src`属性为服务器提供的带有回调函数的...

    jQuery跨域问题解决方案

    在探讨如何使用jQuery解决跨域问题之前,我们首先要了解什么是跨域问题以及为什么会出现这一问题。跨域问题源于浏览器的同源策略(Same-origin policy),这是一个安全机制,限制了来自不同源的文档或脚本如何进行...

Global site tag (gtag.js) - Google Analytics