我们假定阅读这本书的读者是有一定的Javascript和html基础的。这些技术是基于已经形成的多年的标准和协议,网络上有不计其数的关于他们的原理和这些技术的利用的信息。然而对于AJAX和XML新技术,我们觉得在这里做个基本的概述是一个不错的主意。
AJAX长期被认为是跟XML有很紧密的联系,因为XML的缩写就成了AJAX名称的一部分。也并不总是这样。AJAX是指某段时间被开发实践出来的一种新方法的缩写。它的基本含义,AJAX是一系列技术用来提高web应用程序的用户体验,提供更好的可用性,和加快访问的速度。
AJAX的核心技术在2005年前主流web开发者提出前就一直存在。这个核心技术在今天广泛应用是由微软的在发展各种远程脚本技术开发出来的。这些技术被定义为AJAX比传统的远程组件(在DHTML程序实践中定义的)例如:IFRAME和LAYER元素要好得多。
AJAX中最基本和必要的元素就是XMLHttpRequest Javascript对象。这个对象提供一个机制使得提交数据到服务器不需要重新页面,而可以直接载入。这个对象对于不同浏览器的使用是不一样的。XMLHttpRequest对象是简单直观的。下面这个例子就阐述如何请求和使用的:
// instantiate new XMLHttpRequest var request = new XMLHttpRequest; // handle request result request.onreadystatechange = function () { if (request.readyState == 4) { //do something with the content alert(request.responseText); } }; // open a request to /service.php request.open('GET', '/service.php', false); // send the request request.send(null); |
因为很多原因,XMLHttpRequest对象并不能使得在所有浏览器都用同一种实现方式。这个是基于AJAX是一个新技术,尽管很快被制定标准,但是我们仍然需要解决浏览器兼容性的问题。这些问题通常是通过AJAX库里被解决,但是我们作为安全研究者,经常需要使用最基础的做法。
如上所述,XMLHttpRequest对象因浏览器版本不一样而有区别。以微软浏览器为例,要求用ActiveXObject(’Msxml.XMLHTTP‘)甚至AcitiveXobject
(’Microsoft.XMLHTTP‘)来产生跟标准XMLHttpRequest对象类似的对象。其他浏览器也有不同方法来实现。为了兼容所有浏览器,我们用下面定义函数:
var xhr = null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.createRequest) { xhr = window.createRequest(); } else if (window.ActiveXObject) { try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } return xhr; }; // make new XMLHttpRequest object var xhr = getXHR(); |
XMLHttpRequest有很多的方法和属性,汇总在下表:
注意response Text和responseXML属性的区别。他们都是返回服务器返回的文本,但是他们的功能有很大的不同。
responseText用在返回文本,HTML页面,二进制和除了XML外的任何内容。处理XML的时候,就必须要使用responseXML属性,它会把返回的内容解析为DOM对象。
我们已经说明了responsetText的使用方法,现在我们来看看responseXML的使用。在我们给出例子之前,先解释一下XML的目的。
XML被设计为标记语义而非结构,就像HTML。XML是一个自己的小语言,没有任何边界。其他标准跟XML相关是XPATH,XSLT,XML XSD,Xlink,Xforms,SOAP,XMLRPC等等。我们并不打算介绍他们全部,这本书只是快速概述一下,你可以在www.w3c.org学习。
尽管XML和HTML不一样,但是他们都是由元素和标记组成。XML和HTML元素是有很高的结构化。他们可以被表示为一个DOM结构。实际上,DOM是www组织定义的一组规范。它定义XML结构如何被创建和那些方法和属性是必须的。同样,HTML也可以被解析为一个DOM树。
DOM函数中最经常用的一个是 getElementsByTagName,,用来返回包含元素的数组。另外一个常用函数是 getElementById,用来返回基于标识的简单元素。例如,利用Javascript可以很容易提取所有的<p>元素并用“hello world!”替代他们里面的内容。例子如下:
// get a list of all <p> element var p = document.getElementsByTagName('p'); // iterate over the list for (var i = 0; i < p.length; i++) { // set the text of each <p> to 'Hello World!'; p[i].innerHTML = 'Hello World!'; } |
我们可以从XMLHttpRequest对象返回的responseXML 属性通过简单的方法提取。例如:
function getXHR () { var xhr = null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.createRequest) { xhr = window.createRequest(); } else if (window.ActiveXObject) { try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { xhr = new ActiveXObject('Microsoft.XMLHT } catch (e) {} } } return xhr; }; // make new XMLHttpRequest object var request = getXHR(); // handle request result request.onreadystatechange = function () { if (request.readyState == 4) { //do something with the content but in XML alert(request.responseXML.getElementById('message')); } }; // open a request to /service.xml.php request.open('GET', '/service.xml.php', false); // send the request request.send(null); If the server response contains the following in the body: <messageForYou> <overHere id="message">Hello World!</overHere> </messageForYou>
|
浏览器就会在弹出窗口中显示“hello world!”。
理解XML和AJAX的基本概念是很重要的,因为他们正在变成Internet的完整一部分。同样理解这些技术会对传统web应用安全测试产生的影响也是很重要的。