LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

阻止外部提交和客户端脚本不兼容解决方法

admin
2011年3月10日 23:40 本文热度 2847
为了阻止一些人恶意的向站点提交内容,我们在站点中加入了阻止外部提交,你将会发现在客户端使用脚本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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved