阻止外部提交和客户端脚本不兼容解决方法
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
为了阻止一些人恶意的向站点提交内容,我们在站点中加入了阻止外部提交,你将会发现在客户端使用脚本window.open或是document.location.href进行跳转时都成了非法来源了,似乎只能通过点击页面的链接或提交表单的方式才可能是合法的。既然通过提交表单可以,那我们只需在页面中构造一个隐藏的表单,脚本要跳转时动态的更改隐藏表单的提交地址,并用脚本提交表单不就解决了!下边是测试代码:
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("当前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在从外部提交数据!!请立即终止!!" Response.End End if %> 另一种方法是通过修改服务器端程序:既然我们的目的只是为了阻止外部提交,那么只需在有通过Post或Get方式进行提交数据时才验证来源,其他情况都不验证,这样上边脚本不兼容问题自然也就没有了。上边的程序不仅阻止外部提交,连友情链接也都被阻止了。修改后的服务器端程序如下: <% 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("当前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在从外部提交数据!!请立即终止!!" Response.End End if End If %> 当然,也可以将上边验证程序写成一个函数,在需要的时候再调用也是可以的,这也是一种比较通用的做法: <% 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("当前: " & Server_v2 & "<br/>") If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在从外部提交数据!!请立即终止!!" Response.End End if End Sub %> 该文章在 2011/3/10 23:40:09 编辑过 |
关键字查询
相关文章
正在查询... |