咱們假定閱讀這本書的讀者是有必定的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應用安全測試產生的影響也是很重要的。