PHP怎样防止站外提交 分数相送
哪位高手写个防止站外提交
封装成函数
最好了
问题点数:50、回复次数:28Top
1 楼chequan(chequan)回复于 2005-01-03 00:06:37 得分 0
upTop
2 楼chequan(chequan)回复于 2005-01-03 00:07:01 得分 0
根据referer来做Top
3 楼lynn1983(继续努力!^&^)回复于 2005-01-03 00:10:39 得分 0
“HTTP_REFERER”
链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是正确真实的。
Top
4 楼leyan728(乐言)回复于 2005-01-03 00:47:27 得分 0
判断提交页面的来源.Top
5 楼twt326(天地小子)回复于 2005-01-03 08:24:25 得分 5
:Request.ServerVariables("HTTP_REFERER")的工作方式
作者:game.19xz 来源:19xz.com
下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)
下面我们再看看Request.ServerVariables("HTTP_REFERER")不能正常取值的情况:
1.从收藏夹链接
2.单击'主页'或者自定义的地址
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址
显然,Request.ServerVariables("HTTP_REFERER")在多数情况下是不能正常工作的,下面我们看一个例子:
ref.asp
<%
response.write "You came from: " & request.servervariables("http_referer")
%>
ref.htm
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
%>
<meta http-equiv='refresh' content='10;URL=ref.asp'>
<form method=GET action=ref.asp name=getform>
<input type=submit value=' Go there (GET) >> '>
<input type=image style='cursor:hand'>
</form><p>
看看上面的代码会得到什么的结果.
<form method=POST action=ref.asp name=postform>
<input type=submit value=' Go there (POST) >> '>
<input type=image style='cursor:hand'>
</form><p>
<a href='ref.asp'>直接链接<p>
<a href='#' onclick='window.location.href="ref.asp";return false;'>Javascript location<p>
<a href='#'onclick='window.location.replace("ref.asp");return false;'>Javascript replace<p>
<a href='#' onclick='document.getform.submit();return false;'>javascript GET<p>
<a href='#' onclick='document.postform.submit();return false;'>javascript POST
原著:歪书生
来自:chinaasp.com
------------------------------------------------------------------
虽然是ASP的,但原理是一样的,相信能对楼主有所帮助。Top
6 楼mrshelly(Shelly)回复于 2005-01-03 08:35:20 得分 5
不要做防外部提交了。没有啥用的。Top
7 楼gaofaq(老高)回复于 2005-01-03 08:54:19 得分 0
不要做防外部提交了。没有啥用的。
Top
8 楼kingerq(多菜鸟)回复于 2005-01-03 09:02:14 得分 5
用SESSION吧,在提交页面注册一个SESSION,在接受页面里判断是否存在,就可以知道是不是在自己这里提交的了。Top
9 楼Jzealot(小瑞)回复于 2005-01-03 09:34:14 得分 5
HTTP_REFERER只能防止链接请求,不能防表单提交的请求
SESSION?聪明的人都知道先打开你的网站,事先写入session,然后再在站外提交
如果你在服务端加了严密的判断,防外部提交就没有什么意思
如果你想减少服务端的压力,可以把判断全部用js写,这时候就有加防外部提交的必要了
Top
10 楼feixuehenshui(飞雪恨水)回复于 2005-01-03 11:23:41 得分 0
还有一个方式;安全连接,证书Top
11 楼lijinxing(七夜)回复于 2005-01-03 11:47:03 得分 0
我就是Jzealot(困学老二) 的意思。
我想把数据验证,放到客户端来
这样,可以减少服务端的压力。
可是,站外提交就成了问题了。
如果使用SESSION,还不如在服务端验证
象这样行不行
if(strpot($_server['refer']===false)exit;
$Pname = trim($_POST["Pname"]);
$Pprice = trim($_POST["Pprice"]);
$Ptel = trim($_POST["Ptel"]);
$Paddr = trim($_POST["Paddr"]);
$sql = "INSERT INTO products(pname,pprice,ptel,paddr) VALUES('$Pname','$Pprice','$Ptel','$Paddr')";
$result = mysql_query($sql,$conn) or die("添加失败!" . mysql_error()); //执行添加命令!
if ($result){echo "<br><center>添加成功!</center>";}Top
12 楼bflovesnow()回复于 2005-01-03 17:32:28 得分 0
验证码,其实就是 Session 的一种使用,呵呵Top
13 楼nuying117(Rosemary)回复于 2005-01-03 18:43:46 得分 0
function submitcheck($var, $allowget = 0) {
if($GLOBALS[$var]) {
global $HTTP_SERVER_VARS;
if($allowget || ($HTTP_SERVER_VARS['REQUEST_METHOD'] == 'POST' &&
preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $HTTP_SERVER_VARS['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $HTTP_SERVER_VARS['HTTP_HOST']))) {
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}Top
14 楼hancheng(hancheng)回复于 2005-01-03 19:05:31 得分 0
验证码
验证码
www.sycru.com
验证码
验证码Top
15 楼uuq(杜牧)回复于 2005-01-03 19:30:52 得分 5
防不了。如楼上所说每提交一次就要手动输入一次验证码。
这样才能防止机器人提次。再有那些提交框名字经常变下名字。
Top
16 楼eok()回复于 2005-01-03 23:28:24 得分 0
我的想法:读取IP行不?Top
17 楼loveconan(放牛娃娃)回复于 2005-01-04 00:38:29 得分 0
验证要两端都做的!Top
18 楼surfchen(冲浪)回复于 2005-01-04 07:03:23 得分 0
REFERER可以伪造~~
其实我发帖的目的是看时间~嘿嘿`~Top
19 楼ashchen(老陳)回复于 2005-01-04 08:39:55 得分 0
这下你可满足了吧?
目前除了验证码,别的基本无法防止软件自动提交Top
20 楼programdolt(我普普通通,我是个杀猪的)回复于 2005-01-04 09:36:03 得分 0
收藏Top
21 楼gundamzaku(Z钢弹)回复于 2005-01-04 11:03:18 得分 0
关注一下.我也想知道.如何防止站外提交.
这对安全性来说比较重要吧?
另代问一句:SESSION可以伪造吗??Top
22 楼lijinxing(七夜)回复于 2005-01-04 14:56:57 得分 0
现在,防盗连技术不是挺不错的。
谁说一下防盗连。
我用验证码了。
我有个不需要SESSION的验证码
这样能否防止站外提交?
Top
23 楼lijinxing(七夜)回复于 2005-01-04 14:58:05 得分 0
nuying117(Danny) 这个函数 submitcheck 能否给个使用例子。Top
24 楼enjoymyself88(转转~讨厌开贴不结贴的人~~)回复于 2005-01-04 15:54:03 得分 10
下面是代码
<%
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"
response.write "<tr><td style=font:9pt Verdana>"
response.write "<center>你提交的路径有误,禁止从站点外部提交数据!</center>"
response.write "</td></tr></table></center>"
response.end
end if
%>Top
25 楼enjoymyself88(转转~讨厌开贴不结贴的人~~)回复于 2005-01-04 15:58:17 得分 0
不好意思,自己改成php的吧,Top
26 楼lijinxing(七夜)回复于 2005-01-04 17:00:27 得分 0
没接触过ASP,不会改。
哪位大哥,帮忙改一下
改好了。
麻烦附带个应用例子
^_^
马上结贴送分Top
27 楼nuying117(Rosemary)回复于 2005-01-04 19:49:17 得分 15
我说的那个 submitcheck 函数是引用的 discuz论坛的,你可以网上找个discuz 3.1.2 的来,查看一下他的 include/global.php ,里面有 submitcheck 函数的,具体的应用在他的很多地方都使用到了,个人觉得这个函数挺舒服的,我一直用它,防站外提交啊,还是他好~ ^_^Top
28 楼pwtitle(doodoo)回复于 2005-01-05 10:05:41 得分 0
referer是可以伪装的。没啥子用,简单防一下可以。Top




