在page1的时候就打开session,这时这个注册用户有唯一的session id,在page2,page3中监测session,防止直接从浏览器访问page2,page3,当然在page2,page3中对于传递过来的变量要严格的过滤,不符合就返回所谓的page2或者page1,在page1,page2必然是有form的,对不对?method设置为post,那么取值使用:$_POST[]或者$HTTP_POST_VARS[],能操作服务器最好吧register_globals关掉,这样防止直接写入url,在page2,page3中判断referer是不是page1,page2,这样防止自制的form post 做足以上操作,能对付一般的捣乱者至于sandj的删除问题,涉及到删除的程序一般与认证结合吧,要不谁都可以乱删了,只要认证通过,用户做了什么乱七八糟操作,只能是自己负责了,嘿嘿
<input type=hidden value=post name=action>
注意用隐藏的: hidden然后下面判断
if ($action == "post") {
你的第二个PHP文件中的代码
}这样一来他提交数据了就执行ECHO
不提交数据还是显示一堆空输入框明白了吗?
session,这个肯定是有的.
可是不可能每个变量都注册吧?
php是以name作为变量的.
这个好像地球人都知道啊.
他在地址栏里直接给你赋值,你奈他何?nethermit(网络隐士):
能否给几个页面,让我试试?fj100(王子付):
你的想法是好,可是那不是顾客所想要的.强奸顾客是拿不到钱的.chaing(华凌):
你想的好像太容易了吧?netpirate(海盗):
问题时他在地址栏里给你捣乱,
我想session本身的作用好像就是你说的.
please give me an example!
我个人的解决方法是
关闭register_global,GPCS(get,post,cookie,session)变量取值用$HTTP_*_VARS[];
开session,每个页面检测session id十分保持一致;
检测$HTTP_REFERER;
/result.php?tmp=d3050b94a00e2ea51c8d7e6b44c156c9&id=88
echo ***
} else {
***
}为了在关闭 register_globals 情况下帮助用户创建 PHP 应用程序,我们增加了一些新的特殊变量来代替老的全局变量使用。他们是7个新的特殊数组: $_GET - contains form variables sent through GET 包含着通过GET发来的变量 $_POST - contains form variables sent through POST 包含着通过POST发送来的变量 $_COOKIE - contains HTTP cookie variables 包含着HTTP cookie 的变量 $_SERVER - contains server variables (e.g., REMOTE_ADDR) 包含着服务器变量(如 REMOTE_ADDR) $_ENV - contains the environment variables 包含着环境变量 $_REQUEST 是 GET/POST/Cookie 变量的集合,也就是说,所有的来自用户和安全表单的信息。但是从安全角度来看,不能够信任它们。
老老实实用session算了,真的黑客这点水平也挡不住。
http://www.yourdomain.com/page1.php
进入表单输入界面,输入数据后提交到
http://www.yourdomain.com/page2.php
这是用户可以看到自己在上面一页里输入的东西.按下"确定"后提交到
http://www.yourdomain.com/page3.php
在page3.php里完成真正的注册.这就要求:
1.如果用户没有经过page1.php提交,而是直接在浏览器的地址栏里输入
http://www.yourdomain.com/page2.php
或者http://www.yourdomain.com/page3.php
就自动跳转到http://www.yourdomain.com/page1.php.2.如果是提交到了page2.php或page3.php,就不能按 "BACK"回到page1.php或者page2.php.我都是通过数据库来完成的,效率太低,不知道各位虾哥有什么更好的方法?
下页中如果没有这些变量则说明不是从第一页传来的第一页中加:<input type='hiddle' name='XXXX' value='自己定'>
應該還算比較安全
HIDDEN 类似的方法在页面源文件里面是能够看到的
不然人家怎么知道给你在地址栏里面输入什么变量名?
个人感觉使用 qsnake(开工) 的方法:
变量取值用$HTTP_*_VARS[]
可能有作用,但是没有具体测试,不好说。
所以认为还是合并成一个相对好些。
当然还需要加上身份识别。TO: laosan(老三)
首先不满意你对待 fj100(王子付) 的态度
另外你所举例分为PAGE1 PAGE2 PAGE3 的方式似乎不对哦
因为按照那里的方式来说,实际上在PAGE2中也是FORM,不过是HIDDEN的而已
想看还是能看到的呀。当然我只是说这个不对,那个不对,实际上我也没有什么好办法。
甚至在对一些操作的时候我也遇到同样的麻烦
比如对数据库记录的删除时,对方只要找到删除的句子,加上参数就删掉了
对这个问题表示关注!
谢谢你的回答,也很高兴你假如我们的共同讨论.
另外,我为我有什么冲撞的地方表示歉意.但这个问题,你认为就这么无药可救了?
我可对你们有信心哦......
做足以上操作,能对付一般的捣乱者至于sandj的删除问题,涉及到删除的程序一般与认证结合吧,要不谁都可以乱删了,只要认证通过,用户做了什么乱七八糟操作,只能是自己负责了,嘿嘿
很欣赏你的意见.
按照我的page1.php,page2.php,page3.php的想法.
根据你的好的方法,能否给几个简单的实例源程序?
谢谢.
在page1中设置session及给出form。
在page2中检查session的值,如果错误,返回page1;如果正确,给session一个新的值,然后将page1提交的数据插入database中,并设置一个识别字段,设为无效。在页面上显示page1提交的内容及一个隐藏的域,其值为刚插入数据库的那条数据的识别号。
在page3中检查新值是否正确,如不正确,返回page1;如果正确,将记录的识别字段设为有效。
从一过来的有个值假定是aa
但直接输入的这个值就不aa了
这样不就结了吗?
1、如果表单的数据很重要的话,那就需要考虑采用一些类似SSL的安全机制,或者干脆自己写一个php的扩展模块。
2、如果,表单传递的数据不是很重要,只需要针对一般用户做简单的防范、防误操作的话,那就简单一些。
对于每一个表单提交方式采用post,提交按钮加上name属性,例如:
<form method=post name=form1 active=page2>
……
<input type='submit' name='page1_sub' value='提交'>
</form>在page2页,首先用 $_POST 对数据来源作一个验证,确定是通过Post方式传来的数据,然后对用户数据作一个过滤,去处html,/,\,#,$,%,&,|……等一些特殊字符,最后在作机一步处理。($_POST函数可以查阅PHP使用手册,或去www.php.net的online document上查阅更多最新的信息)
<?php
if($submit){
$text1=$HTTP_POST_VARS[text1];
echo $text1;
if(!$text1){
die("請填寫完整");
}
}?>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META content="text/html; charset=big5" http-equiv=Content-Type>
<link href=css/site.css rel=stylesheet>
</HEAD>
<BODY>
<FORM METHOD=POST ACTION="test1.php?text1=noasdf" NAME="form1">
<INPUT TYPE="text" NAME="text1">
<INPUT TYPE="submit" name="submit" value="提交">
</FORM>
</BODY>
</HTML>
註:
上面有兩個同名參數,一個get方法,一個post方法.
post方法的參數不會顯示在地址欄上
echo "<p>数据来自<a href=".$_ENV["HTTP_REFERER"].">";
echo $_ENV["HTTP_REFERER"];
echo "</a>";
...操作代码...
}else{
echo "<script language=javascript>\n";
echo "alert(\"您所提供的信息不正确\");\n";
echo "location=\"page1.php\";\n";
echo "</script>";
};
<?
while(list($key,$value)=each($HTTP_GET_VARS))
$arr_request[strtolower($key)]=$value;
$var1=$arr_request['var1'];
$var2=$arr_request['var2'];
...
?>
处理get方式传输的数据
或用
<?
while(list($key,$value)=each($HTTP_POST_VARS))
$arr_request[strtolower($key)]=$value;
$var1=$arr_request['var1'];
$var2=$arr_request['var2'];
...
?>
处理post方式传输的数据
只能处理form传来的数据
<form method="Post" name="Form1" action="deal.php">
<input type=hidden name="hidden" value="111">
</form>
在处理的时候判断$hidden的值!
如果不为空则处理,否则不处理!
用EMPTY($HIDDEN)或者isset($hidden)来判断!
还是判断数据的来源比较起来安全
在page1.php里设置一个session变量
在page2.php里检测这个session是否设置过如果没有设置过
就
{
header("location: page1.php");
exit();
}
这样就不会有问题了
在page1.php里设置一个session变量
{
session_start();
$flag=0;
session_register($flag);//flag为任意变量
、、、、、、、
}
在page2.php里检测这个session是否设置过如果没有设置过
就
{
session_start();
if(!session_is_registered($flag))
{
header("location: page1.php");
exit();
}
、、、、、、、、、
}
这样就不会有问题了
session_register($flag)
应该是这种写法吧?
session_register("flag")不需要变量符号哦:$
用.net吧,那没这问题了!!!!
session也不好,依赖于客户端浏览器的设置,万一人家就是禁止,咋办?
还是用数据库保存信息最安全,用
md5(uniqid($prefix))
生成唯一串,PHP文件的第一件事就是检查这个串