咱们假定阅读这本书的读者是有必定的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应用安全测试产生的影响也是很重要的。