欢迎光临

木子屋

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

作者: dnawo

日期: 2008-01-24 01:08 PM

分类: 脚本语言

内容: 为了阻止一些人恶意的向站点提交内容，我们在站点中加入了阻止外部提交，你将会发现在客户端使用脚本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
%>

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.769 ms

返回

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

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.769 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.801 ms

返回