如何防止站外提交表单?

时间:2022-11-27 19:29:46
最紧公司网站上线了.总是有人在站外不停自提交表单数据进来..验证码.随机FORMHASH,什么都试过了.还是不行.请问有什么高招?

17 个解决方案

#1


该回复于2011-01-10 13:31:48被版主删除

#2


验证码复杂化,让对方无法分析
限制同一IP发布次数,甚至可以冻结帐号一段时间
发布内容先审核再显示

#3


引用 2 楼 ihandler 的回复:
验证码复杂化,让对方无法分析
限制同一IP发布次数,甚至可以冻结帐号一段时间
发布内容先审核再显示


该说的都说了 

#4


if(Request.ServerVariables["HTTP_REFERER"]==null)
{
非法提交
}

#5


验证码,记录IP地址根据一段时间内不能重复访问
审核

#6


嗯 验证IP

#7



if (Request.ServerVariables["HTTP_REFERER"] == null || !Request.ServerVariables["HTTP_REFERER"].ToString().Contains(Request.ServerVariables["HTTP_HOST"].ToString()))   
{
  Server.Transfer("Error.aspx");   

#8


该回复于2011-01-10 13:52:56被版主删除

#9


以上方法我基本上都试过了.限IP有可能会使正常用户也爱到影响

#10


引用 4 楼 zsyok 的回复:
if(Request.ServerVariables["HTTP_REFERER"]==null)
{
非法提交
}

这个可以假冒,没多大意义。。

#11


可以参考图片的防盗链模式
如果请求不是来自身网站 就拒绝访问

#12


顶上.这是个值得探讨的问题

#13


7楼的方法并不完整。
假设你的主机是:abc.xxx.com
那么bc.xxx.com 或 c.xxx.com 还是可以递交,因为你的主机头里也包含这两个主机头。
所以这里不能用 Contains 来判断。

if (Request.HttpMethod.Equals("POST") || Request.HttpMethod.Equals("GET"))
{
    string HTTP_REFERER = Request.ServerVariables["HTTP_REFERER"].ToString();
    if (HTTP_REFERER != "" && HTTP_REFERER != null)
    {
        HTTP_REFERER = HTTP_REFERER.Substring(HTTP_REFERER.IndexOf(@"//") + 2);
        HTTP_REFERER = HTTP_REFERER.Substring(0, HTTP_REFERER.IndexOf(@"/"));
    }
    if (HTTP_REFERER != Request.ServerVariables["HTTP_HOST"].ToString())
    {
        Server.Transfer("Error.aspx");
    }
}


另外,bc.xxx.com 或 c.xxx.com 可以通过本地DNS解析得到。

#14


登陆验证.

#15


没有办法,伪造表单,和浏览器一样,无法区分,给提交频繁的使用图片验证。

#16


每个地方接受数据的地方是固定的吧
就判断REFERER吧
或者用其他的校验码

#17


帮顶。。

#1


该回复于2011-01-10 13:31:48被版主删除

#2


验证码复杂化,让对方无法分析
限制同一IP发布次数,甚至可以冻结帐号一段时间
发布内容先审核再显示

#3


引用 2 楼 ihandler 的回复:
验证码复杂化,让对方无法分析
限制同一IP发布次数,甚至可以冻结帐号一段时间
发布内容先审核再显示


该说的都说了 

#4


if(Request.ServerVariables["HTTP_REFERER"]==null)
{
非法提交
}

#5


验证码,记录IP地址根据一段时间内不能重复访问
审核

#6


嗯 验证IP

#7



if (Request.ServerVariables["HTTP_REFERER"] == null || !Request.ServerVariables["HTTP_REFERER"].ToString().Contains(Request.ServerVariables["HTTP_HOST"].ToString()))   
{
  Server.Transfer("Error.aspx");   

#8


该回复于2011-01-10 13:52:56被版主删除

#9


以上方法我基本上都试过了.限IP有可能会使正常用户也爱到影响

#10


引用 4 楼 zsyok 的回复:
if(Request.ServerVariables["HTTP_REFERER"]==null)
{
非法提交
}

这个可以假冒,没多大意义。。

#11


可以参考图片的防盗链模式
如果请求不是来自身网站 就拒绝访问

#12


顶上.这是个值得探讨的问题

#13


7楼的方法并不完整。
假设你的主机是:abc.xxx.com
那么bc.xxx.com 或 c.xxx.com 还是可以递交,因为你的主机头里也包含这两个主机头。
所以这里不能用 Contains 来判断。

if (Request.HttpMethod.Equals("POST") || Request.HttpMethod.Equals("GET"))
{
    string HTTP_REFERER = Request.ServerVariables["HTTP_REFERER"].ToString();
    if (HTTP_REFERER != "" && HTTP_REFERER != null)
    {
        HTTP_REFERER = HTTP_REFERER.Substring(HTTP_REFERER.IndexOf(@"//") + 2);
        HTTP_REFERER = HTTP_REFERER.Substring(0, HTTP_REFERER.IndexOf(@"/"));
    }
    if (HTTP_REFERER != Request.ServerVariables["HTTP_HOST"].ToString())
    {
        Server.Transfer("Error.aspx");
    }
}


另外,bc.xxx.com 或 c.xxx.com 可以通过本地DNS解析得到。

#14


登陆验证.

#15


没有办法,伪造表单,和浏览器一样,无法区分,给提交频繁的使用图片验证。

#16


每个地方接受数据的地方是固定的吧
就判断REFERER吧
或者用其他的校验码

#17


帮顶。。