阻止外部提交和客戶端腳本不兼容解決方法
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
為了阻止一些人惡意的向站點(diǎn)提交內(nèi)容,我們?cè)谡军c(diǎn)中加入了阻止外部提交,你將會(huì)發(fā)現(xiàn)在客戶端使用腳本window.open或是document.location.href進(jìn)行跳轉(zhuǎn)時(shí)都成了非法來源了,似乎只能通過點(diǎn)擊頁面的鏈接或提交表單的方式才可能是合法的。既然通過提交表單可以,那我們只需在頁面中構(gòu)造一個(gè)隱藏的表單,腳本要跳轉(zhuǎn)時(shí)動(dòng)態(tài)的更改隱藏表單的提交地址,并用腳本提交表單不就解決了!下邊是測試代碼:
index.htm: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <!-- <meta http-equiv="refresh" content="5;URL=test.asp" /> --> <title>外部提交測試</title> </head> <body> <form id="jumpto" name="jumpto" method="post" action="" style="display:none;"></form> <a href="test.asp">Links</a> <br /><br /><br /> <input name="btn" type="button" id="btn" value="window.location" onclick="window.location = 'test.asp';" /><br /> <input name="btn2" type="button" id="btn2" value="document.location.href" onclick="document.location.href = 'test.asp';" /><br /> <input name="btn3" type="button" id="btn3" value="window.open" onclick="window.open('test.asp');" /><br /> <input name="btn4" type="button" id="btn4" value="location.replace" onclick="location.replace('test.asp');" /><br /> <input name="btn5" type="button" id="btn5" value="jumpto(就我可以)" onclick="jumpto.action='test.asp';jumpto.submit();" /><br /> </body> </html> test.asp: <% Server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) Server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) Response.Write("來源: " & mid(server_v1,8,len(server_v2)) & "<br/>") Response.Write("當(dāng)前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在從外部提交數(shù)據(jù)??!請(qǐng)立即終止!!" Response.End End if %> 另一種方法是通過修改服務(wù)器端程序:既然我們的目的只是為了阻止外部提交,那么只需在有通過Post或Get方式進(jìn)行提交數(shù)據(jù)時(shí)才驗(yàn)證來源,其他情況都不驗(yàn)證,這樣上邊腳本不兼容問題自然也就沒有了。上邊的程序不僅阻止外部提交,連友情鏈接也都被阻止了。修改后的服務(wù)器端程序如下: <% If Instr(Request.Form,"=")>0 or Instr(Request.QueryString,"=")>0 Then Server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) Server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) Response.Write("來源: " & mid(server_v1,8,len(server_v2)) & "<br/>") Response.Write("當(dāng)前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在從外部提交數(shù)據(jù)!!請(qǐng)立即終止??!" Response.End End if End If %> 當(dāng)然,也可以將上邊驗(yàn)證程序?qū)懗梢粋€(gè)函數(shù),在需要的時(shí)候再調(diào)用也是可以的,這也是一種比較通用的做法: <% Sub checkForm() Server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) Server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) Response.Write("來源: " & mid(server_v1,8,len(server_v2)) & "<br/>") Response.Write("當(dāng)前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在從外部提交數(shù)據(jù)??!請(qǐng)立即終止??!" Response.End End if End Sub %> 該文章在 2011/3/10 23:40:09 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |