原文地址:http://www.blog.cqust.cn/user1/webdesign/archives/2006/89.html

?????? 很早就想寫一篇關(guān)于網(wǎng)頁源代碼屏蔽的文章。是因?yàn)榻?jīng)常編出些JS腳本的之后,在沾沾自喜的同時(shí),也在擔(dān)心源代碼會(huì)被人家看到,盜用我的腳本。所以一直以來,我都在盡力維護(hù)我的網(wǎng)頁源代碼的安全。雖然目前還沒有找到完全安全的屏蔽方法(也就是說,這些方法在我想出來的同時(shí),自己已經(jīng)知道其弱點(diǎn)和破解方法了),但是,我這里有很多屏蔽的思路,來總結(jié)一下。?

  眾所周知,要保護(hù)一個(gè)頁面,最基礎(chǔ)的就是要屏蔽右鍵。而現(xiàn)在網(wǎng)頁上用得最多的是function?click(),即下面這段代碼:?

〈script〉?
function?click(){?
???if(event.button==2){?
?????????????alert(?''本網(wǎng)站歡迎您?!!'');?
???}?
}?
document.onmousedown=click?
〈/script〉?

  但是這種屏蔽方法的破解方法也是眾所周知的。那就是連續(xù)單擊鼠標(biāo)左鍵和右鍵便又可以看到右鍵菜單了。但是,我見過一種很好的屏蔽右鍵的方法。它的原理和上面所說的不同。它并不是用JS來編寫的腳本,而是利用定義網(wǎng)頁屬性來起到限制的作用。而且,在屏蔽中應(yīng)該盡量的避開使用JS腳本。因?yàn)橹灰獮g覽者把IE 里的javascript腳本禁用了。那么一切屏蔽都白費(fèi)。?

  那么繼續(xù)說那種通過修改網(wǎng)頁屬性的屏蔽右鍵的方法。這種方法利用了HTML里的〈body〉來作修改,它只有以下短短的一行代碼:?

〈body?oncontextmenu=self.event.returnValue=false〉?

  這里,定義了oncontextmenu。使得右鍵的值為false,起到了屏蔽右鍵的效果。現(xiàn)在,再試試看剛才的破解方法,已經(jīng)不行了。左右鍵連擊已經(jīng)不能再打開右鍵菜單。不但是這個(gè),再試試看其他的方法。無論你怎樣的亂點(diǎn),右鍵都沒有用。因?yàn)樵谶@個(gè)網(wǎng)頁里,右鍵已經(jīng)不存在了。對于一個(gè)不存在的功能鍵,你又能做什么呢??

  但是,屏蔽了右鍵還不能解決問題。如果我要復(fù)制一段文字,或是一張圖片。那么,把它選中后用ctrl+C?再用?ctrl+V不就可以復(fù)制粘貼了嘛。對了,接下來要講的,就是屏蔽左鍵(什么?屏蔽左鍵?那這個(gè)網(wǎng)頁不就差不多廢掉了?別急,沒說完呢,左鍵只有一項(xiàng)功能是很討厭的)的選定功能。?

  那么,如上所說,用JS來屏蔽是沒有用的,治標(biāo)不治本的。那么,我們就還用網(wǎng)頁的最基礎(chǔ)的語言:HTML來定義吧。還是老招數(shù),定義〈body〉。這次用的參數(shù)是:onselectstart。就是左鍵選定的參數(shù)。代碼如下:?

〈body?onselectstart="return?false"〉?

  這樣,左鍵選定功能就給輕易屏蔽了。原理和上面的一樣。現(xiàn)在,再用你的左鍵選擇任意內(nèi)容把,已經(jīng)沒有用了。自然也不能ctrl?+?C,ctrl?+V了。那么,現(xiàn)在我們來把這兩部分合并起來。徹底控制左右鍵!:?

〈body?oncontextmenu=self.event.returnValue=false?onselectstart="return?false"〉?

  現(xiàn)在,左右鍵的問題總算是解決了吧。?

  好,現(xiàn)在我們來看另一個(gè)問題。大家都知道,在IE瀏覽器的菜單欄里的“查看”項(xiàng)里。有一個(gè)“查看源代碼”選項(xiàng)。這么一來,雖然我們屏蔽了右鍵里的查看源代碼。但是,只要用菜單欄里的查看源代碼,還是可以看到源代碼的。這可怎么辦呢??

  我最初的想法是用框架來避開源代碼的查看。也就是說,只要一個(gè)網(wǎng)頁是嵌在框架里的,那么在菜單欄里選擇查看源代碼查看到的只是框架網(wǎng)頁的源代碼。一般格式如下:?

〈html〉?

〈head〉?
〈meta?HTTP-EQUIV="Content-Type"?CONTENT="text/html;?charset=gb2312"〉?
〈title〉本網(wǎng)站標(biāo)題〈/title〉?
〈/head〉?

〈frameset?rows="47,*"?framespacing="0"?border="0"?frameborder="0"〉?
?〈frame?name="header"?scrolling="no"?noresize?target="main"?src="top.htm"〉?
?〈frame?name="main"?src="main.htm"?scrolling="auto"?target="_self"〉?
?〈noframes〉?
?〈body〉?

?〈p〉此網(wǎng)頁使用了框架,但您的瀏覽器不支持框架。〈/p〉?

?〈/body〉?
?〈/noframes〉???
〈/frameset〉?

〈/html〉?

  這樣看起來對方是沒有直接看到你的源代碼了。但是,如果一個(gè)人要看你的源代碼,那他八成是能看懂的。如果懂一點(diǎn)HTML的話,都能看出這兩句是什么意思:?

?〈frame?name="header"?scrolling="no"?noresize?target="main"?src="top.htm"〉?
?〈frame?name="main"?src="main.htm"?scrolling="auto"?target="_self"〉?

  這兩句的意思就是:在header(也就是網(wǎng)頁頂部)處引用相對路徑下的top.htm網(wǎng)頁文件。而在main(也就是占據(jù)網(wǎng)頁大部分頁面的位置)處引用相對路徑下的main.htm網(wǎng)頁文件。就這兩點(diǎn)是關(guān)鍵的,其他就不作解釋了,大家也都懂的。而上面所講的利用框架來隱藏源代碼的方法就是將要顯示頁面放在main部分。而將header部分的大小設(shè)為0。但是這樣一來,利用菜單欄里的查看源代碼,還是能查看到框架網(wǎng)頁的源代碼。只要看到這兩句,就知道我們前面用的手法了。也就是說,只要將框架網(wǎng)頁的名字改為目標(biāo)網(wǎng)頁,便可以用相同的方法直接看到目標(biāo)網(wǎng)頁的源代碼了。如:框架網(wǎng)頁:http: //www.sina.com.cn/red.htm的源代碼如上,就可以改為Http://www.sina.com.cn/main.htm。這樣便可直接瀏覽被保護(hù)網(wǎng)頁,屏蔽源代碼的效果還是沒有達(dá)到。?

  那么,有些人就會(huì)想到,如果對方看不到框架網(wǎng)頁的源代碼。又何談去直接打開被保護(hù)網(wǎng)頁?對,這就是接下來我要講的。如果要一個(gè)頁面的菜單欄內(nèi)的查看源代碼失去效用。那最簡單的辦法就是去掉菜單欄。而這一點(diǎn)是可以通過彈出窗口來實(shí)現(xiàn)的。之所以不選用超鏈接打開無菜單欄窗口是因?yàn)槟菢訒?huì)暴露目標(biāo)地址,瀏覽者可以直接在瀏覽器中敲入地址,而繞過這個(gè)屏蔽的菜單欄。要使用超鏈接打開無菜單欄窗口,就必須在一個(gè)已受到源代碼屏蔽保障的網(wǎng)頁中使用相關(guān)鏈接。?

  那么,我們就看看如何利用彈出窗口來去掉菜單欄。其實(shí),我們要做的,就是讓目標(biāo)網(wǎng)頁在一個(gè)廣告條中打開。這個(gè)代碼幾乎每個(gè)大型網(wǎng)站都會(huì)有的。代碼如下:?

〈script〉?
〈!--?
window.open("red.htm",?"red",?"resizable=yes,width=500,height=300");?
--〉?
〈/script〉?

  這里,在window.open后的括號(hào)里的第一個(gè)參數(shù)就是彈出窗口所顯示的網(wǎng)頁的位置,這里例子里是先對位置下的red.htm網(wǎng)頁文件。這時(shí)運(yùn)行便會(huì)談出一個(gè)顯示有red.htm的無菜單欄的窗口。好,我們的目的達(dá)到了。但是,這個(gè)窗口有一個(gè)缺陷,就是沒有滾動(dòng)條。因?yàn)樵谡劤龃翱诘恼Z句: window.open里并沒有關(guān)于滾動(dòng)條的參數(shù),(或是我不知道?歡迎高手來信指出),所以這里打開的網(wǎng)頁建議只做成網(wǎng)頁的導(dǎo)航頁。?

  但是,用以上方法取消菜單欄,必須有一個(gè)第二方的網(wǎng)頁來作彈出的工作。那么,這個(gè)用來彈出窗口的網(wǎng)頁又成為了一個(gè)問題的所在。舉例來說:假設(shè),我們用一個(gè)index.htm來作彈出窗口的工作。也就是打開index.htm之后,會(huì)彈出red.htm的無菜單欄窗口。前面我們也提到了,如果知道了一個(gè)網(wǎng)頁的地址后,無論這個(gè)網(wǎng)頁是否隱藏在無菜單欄之下,你都能看到它的源代碼。那么,不讓這個(gè)red.htm的地址暴露也就成了解決這個(gè)問題的關(guān)鍵。但是,只要這個(gè)index.htm被打開,就可以看到源代碼。但是,不妨反過來想想,如果我們把index.htm給關(guān)起來呢?只要在瀏覽者沒有來得及查看 index.htm之前將它關(guān)閉,就能保住它的源代碼了。那么,在這個(gè)index.htm里就有得做些文章了。?
那就是,添加關(guān)閉網(wǎng)頁的代碼。?

  那么,我們就可以用window.close來關(guān)閉窗口。代碼如下:?

〈script〉?
〈!--?
window.open();?
--〉?
〈/script〉?

  那么,現(xiàn)在我們把兩部分代碼合并起來。現(xiàn)在,得到的效果就是——直接有一個(gè)無菜單欄的窗口打開了。因?yàn)橛?jì)算機(jī)的處理速度很快,如果我們將這兩段代碼緊接著寫在一起,那么我們就只能看到新建的窗口。代碼如下:?

〈script〉?
〈!--?
window.open("red.htm",?"red",?"resizable=yes,width=500,height=300");?
window.close();?
--〉?
〈/script〉?

  而原來的窗口,已在我們無察覺的情況下關(guān)閉了。這樣,就別說查看該網(wǎng)頁的源代碼了。這里,加入上面源代碼的網(wǎng)頁起了一個(gè)跳板的作用。但是,在這里,我們要注意幾點(diǎn)。第一,用來做跳板的網(wǎng)頁不應(yīng)該命名為index.htm。將它換一個(gè)名字,然后把默認(rèn)首頁的名字改為更改過的名字。這樣,是瀏覽者能在輸入網(wǎng)之后便自動(dòng)訪問該頁。而又不致讓對方知道該頁的名稱。如果不這樣做,就會(huì)導(dǎo)致對方猜測出該頁的位置。如:172.0.0.0/index.htm。這樣,就可以通過在瀏覽器中提交:View-Source:Http://172.0.0.0/index.htm就可以看到該頁的源代碼了。?

  在屏蔽掉了菜單欄和工具欄之后,我們想,如果沒有了最上方的窗口條該多好呢?下面我們要做的事情,有前提,就是在上面所說的在利用跳板頁面打開一個(gè)無菜單欄的窗口之后。我們要做什么呢?就是讓我們顯示網(wǎng)站內(nèi)容的窗口只顯示內(nèi)容,(是啊,網(wǎng)站不就是給別人瀏覽的嗎?要瀏覽器和windows的那么多功能做什么呀……)只要內(nèi)容,其余一律去掉。我們就可以通過一段Javascript來完成。下面這段代碼就是用來定義無任何窗口特征的代碼:?

〈script〉?
function?open1(url){?
newwin=window.open(url,''newwindow'',''fullscreen=1'')?
newwin.resizeTo(800,600)?
newwin.moveTo(screen.width/0-800,screen.height/0-600)?
}?
〈/script〉?

  其中,function?open1(url)定義了超鏈接的寫法。所以,我們在寫鏈接的地址時(shí),應(yīng)該這樣寫:javascript:open1 (url)。比如我要打開一個(gè)無窗口特征的新浪首頁就應(yīng)該在文字或圖片的超鏈接里這樣寫:javascript:open1(‘http: www.sina.com.cn’)。當(dāng)然,括號(hào)內(nèi)也支持相對路徑。最后寫出來的格式應(yīng)該是:?

〈script〉?
function?open1(url){?
newwin=window.open(url,''newwindow'',''fullscreen=1'')?
newwin.resizeTo(800,600)?
newwin.moveTo(screen.width/0-800,screen.height/0-600)?
}?
〈/script〉?
〈body?oncontextmenu=self.event.returnValue=false?onselectstart="return?false"〉?
〈td?width ="100%"〉〈a?href="javascript:open1(''main.htm''),window.close()"〉〈img?border="0"?src="pic/blank1.gif"?style="position:?absolute;?left:?556; ?top:?142"?width="169"?height="57"〉〈/a〉〈/td〉?
〈/body〉?

  這樣,我們就達(dá)到了打開無窗口邊的網(wǎng)頁了。并且,在這個(gè)網(wǎng)頁中,會(huì)自動(dòng)加入滾動(dòng)條,這樣,就不會(huì)像前面那樣看不到下面的內(nèi)容啦。?

  最后我們要做的工作,就是把每一頁,或者你認(rèn)為重要的關(guān)鍵的頁面進(jìn)行加密,就OK啦。怎樣對網(wǎng)頁的源代碼進(jìn)行加密就不用我多說了吧?網(wǎng)上到處都有,可以用工具,也可以自己寫一個(gè)htm文件來轉(zhuǎn)換。加密軟件,我推薦“Batch?HTML?Encryptor”,去google找吧。還有轉(zhuǎn)換加密網(wǎng)頁的代碼如下:?

〈HTML〉〈HEAD〉〈TITLE〉網(wǎng)頁加密解密〈/TITLE〉?
〈META?http-equiv=Content-Type?content="text/html;?charset=gb2312"〉?
〈META?content="MSHTML?6.00.2600.0"?name=GENERATOR〉〈!--?大地軟件工作室--〉〈LINK?
href="/style.css"?rel=stylesheet〉?
???〈META?content="Microsoft?FrontPage?4.0"?name=GENERATOR〉?
〈/HEAD〉?
〈BODY?bgColor=#ffffff?leftMargin=0?topMargin=0?onload=initStyleElements()〉?
〈DIV?
style="LEFT:?139px;?WIDTH:?106px;?POSITION:?absolute;?TOP:?52px;?HEIGHT:?36px"〉?
〈TABLE?cellSpacing=0?cellPadding=0?width=760?align=center?border=0〉〈!--DWLayoutTable--〉?
?〈TBODY〉?
?〈TR〉?
??〈TD?vAlign=top?align=middle?width=760?height=310〉?
???〈DIV?align=center〉?
???〈H2〉?
???〈SCRIPT?language=JavaScript〉?
〈!--?
var?i=0;?
var?ie=(document.all)?1:0;?
var?ns=(document.layers)?1:0;?

function?initStyleElements()?/*?Styles?for?Buttons?Init?*/?
{?
var?c?=?document.pad;?
if?(ie)?
{?
//c.text.style.backgroundColor="#DDDDDD";?
c.compileIt.style.backgroundColor="#C0C0A8";?
c.compileIt.style.cursor="hand";?
c.select.style.backgroundColor="#C0C0A8";?
c.select.style.cursor="hand";?
c.view.style.backgroundColor="#C0C0A8";?
c.view.style.cursor="hand";?
c.retur.style.backgroundColor="#C0C0A8";?
c.retur.style.cursor="hand";?
c.clear.style.backgroundColor="#C0C0A8";?
c.clear.style.cursor="hand";?
}?
else?return;?
}?

/*?Buttons?Enlightment?of?"Compilation"?panel?*/?
function?LightOn(what)?
{?
if?(ie)?what.style.backgroundColor?=?''#E0E0D0'';?
else?return;?
}?
function?FocusOn(what)?
{?
if?(ie)?what.style.backgroundColor?=?''#EBEBEB'';?
else?return;?
}?
function?LightOut(what)?
{?
if?(ie)?what.style.backgroundColor?=?''#C0C0A8'';?
else?return;?
}?
function?FocusOff(what)?
{?
if?(ie)?what.style.backgroundColor?=?''#DDDDDD'';?
else?return;?
}?
/*?Buttons?Enlightment?of?"Compilation"?panel?*/?

function?generate()?/*?Generation?of?"Compilation"?*/?
{?
code?=?document.pad.text.value;?
if?(code)?
{?
document.pad.text.value=''Compiling…Please?wait!'';?
setTimeout("compile()",1000);?
}?
else?alert(''First?enter?something?to?compile?and?then?press?CompileIt'')?
}?
function?compile()?/*?The?"Compilation"?*/?
{?
document.pad.text.value='''';?
compilation=escape(code);?
document.pad.text.value="/〈script〉\n〈!--\ndocument.write(unescape(\""+compilation+"\"));\n//--〉\n〈\/script〉";?
i++;?
if?(i=1)?alert("Page?compiled?1?time!");?
else?alert("Page?compiled?"+i+"?times!");?
}?
function?selectCode()?/*?Selecting?"Compilation"?for?Copying?*/?
{?
if(document.pad.text.value.length〉0)?
{?
document.pad.text.focus();?
document.pad.text.select();?
}?
else?alert(''Nothing?for?be?selected!'')?
}?
function?preview()?/*?Preview?for?the?"Compilation"?*/?
{?
if(document.pad.text.value.length〉0)?
{?
pr=window.open("","Preview","scrollbars=1,menubar=1,status=1,width=700,height=320,left=50,top=110");?
pr.document.write(document.pad.text.value);?
}?
else?alert(''Nothing?for?be?previewed!'')?
}?
function?uncompile()?/*?Decompiling?a?"Compilation"?*/?
{?
if?(document.pad.text.value.length〉0)?
{?
source=unescape(document.pad.text.value);?
document.pad.text.value=""+source+"";?
}?
else?alert(''You?need?compiled?code?to?uncompile?it!'")?
}?
//?--〉?
〈/SCRIPT〉?
???〈BR〉〈B〉〈FONT?color=#333333〉網(wǎng)頁HTML源代碼加密解密器〈/FONT〉〈/B〉〈/H2〉〈/DIV〉?
???〈TABLE?cellSpacing=0?borderColorDark=#000000?cellPadding=10?width=750?
???align=center?borderColorLight=#ffffff?border=2〉?
????〈TBODY〉?
????〈TR〉?
?????〈TD〉?
??????〈DIV?align=center〉〈BR〉將你的源代碼貼到編輯區(qū)域即可〈BR〉〈BR〉?
??????〈TABLE?cellSpacing=0?cellPadding=0?width="100%"?border=0〉?
???????〈TBODY〉?
???????〈TR〉?
????????〈TD?width="100%"〉〈!--?Compilation?Panel?--〉?
?????????〈FORM?name=pad?method=post?align="center"〉?
?????????〈DIV?align=center〉〈TEXTAREA?style="WIDTH:?95%;?BACKGROUND-COLOR:?#ebebeb"?name=text?rows=11?cols=58〉〈/TEXTAREA〉?
????????? 〈BR〉〈BR〉〈BR〉〈INPUT?onmouseover=LightOn(this)?onclick=generate() ?onmouseout=LightOut(this)?type=button?value="/加密?name=compileIt〉?
〈INPUT?onmouseover=LightOn(this)?onclick=selectCode()?onmouseout=LightOut(this)?type=button?value=全選?name=select〉??
〈INPUT?onmouseover=LightOn(this)?onclick=preview()?onmouseout=LightOut(this)?type=button?value=預(yù)覽?name=view〉??
〈INPUT?onmouseover=LightOn(this)?onclick=uncompile()?onmouseout=LightOut(this)?type=button?value=解密?name=retur〉??
〈INPUT?onmouseover=LightOn(this)?onmouseout=LightOut(this)?type=reset?value=清除?name=clear〉??
?????????〈/DIV〉〈/FORM〉〈!--?Compilation?Panel?--〉〈/TD〉〈/TR〉〈/TBODY〉〈/TABLE〉〈/DIV〉〈/TD〉〈/TR〉〈/TBODY〉〈/TABLE〉?
???〈DIV?align=center〉〈BR〉〈/DIV〉?
???〈DIV?align=center〉〈/DIV〉?〈/TD〉〈/TR〉〈/TBODY〉〈/TABLE〉?
〈/DIV〉?
〈DIV〉〈/DIV〉〈/BODY〉〈/HTML〉?

  總結(jié)一下……按我的思路,屏蔽網(wǎng)頁源代碼主要分為以下幾個(gè)步驟:?

  1.??做一個(gè)網(wǎng)頁跳板,彈出要保護(hù)的廣告條狀頁面,并將自身關(guān)閉,以避免泄露需保護(hù)網(wǎng)頁的地址。?

  2.??由于上述條件屏蔽了廣告條內(nèi)網(wǎng)頁的源代碼,所以可以用這個(gè)網(wǎng)頁作為歡迎頁。?

  3.??在歡迎頁中,利用Javascript以超連接的形式來打開無窗口邊的新窗口顯示網(wǎng)站內(nèi)容。?

  4.??對每一個(gè)頁面或者對重要的關(guān)鍵的頁面進(jìn)行源代碼加密,為源代碼加一把鎖。(有些人說對源代碼進(jìn)行加密沒有用,但是我覺得要使用另類點(diǎn)的加密方法就可以了,比如軟件的加密方法就很普通。但是用我自己寫的htm文件加密的源代碼,一般軟件是不能進(jìn)行解密的。大家有興趣的話可以試試。)?

  5.??最后不得不提的就是windows網(wǎng)頁臨時(shí)文件夾了,那里面會(huì)把源代碼紀(jì)錄的。但是不用怕,加入一種代碼,就可以使windows不下載網(wǎng)頁的源代碼,直接瀏覽。可以去找找。?

  有些東西要注意的:?

  1.??在文中所說的自動(dòng)關(guān)閉網(wǎng)頁的語句:window.close()有一個(gè)弊病。就是會(huì)在關(guān)閉窗口之前詢問是否關(guān)閉窗口,如果選擇否的話目的還是達(dá)不到。?

  2.??以上一切都只對IE瀏覽器有效用,如果用別的瀏覽器來瀏覽,就有可能出現(xiàn)屏蔽不成功的現(xiàn)象。?

  3.??關(guān)于網(wǎng)頁源代碼屏蔽,一直以來是可望而不可及的。我只是把思路寫下來,具體實(shí)現(xiàn),還是要靠大家自己研究的啦。