检查session,检查referer,检查method(post/get),检查浏览网页的时间,设置随时间而变化的临时hidden密码,反正很多种啦,将黑客赶尽杀绝。

解决方案 »

  1.   

    另一个办法是将两个PHP文件合成一个PHP文件在第一个PHP文件中的<form>  </form>中间加一行
    <input type=hidden value=post name=action>
    注意用隐藏的: hidden然后下面判断
        if ($action == "post") {
             你的第二个PHP文件中的代码
        }这样一来他提交数据了就执行ECHO
    不提交数据还是显示一堆空输入框明白了吗?
      

  2.   

    用iframe有时候也可以挡一下!JOK^_^
      

  3.   

    ding_csdn(充電灌水): 
    session,这个肯定是有的.
    可是不可能每个变量都注册吧?
    php是以name作为变量的.
    这个好像地球人都知道啊.
    他在地址栏里直接给你赋值,你奈他何?nethermit(网络隐士):
    能否给几个页面,让我试试?fj100(王子付):
    你的想法是好,可是那不是顾客所想要的.强奸顾客是拿不到钱的.chaing(华凌):
    你想的好像太容易了吧?netpirate(海盗):
    问题时他在地址栏里给你捣乱,
    我想session本身的作用好像就是你说的.
      

  4.   

    不用那么复杂吧,看看PHP4.1X出版公告,用$_POST可以判断此页是否是由表单提交而来。。4.1X以下也有相关变量判断的。。
      

  5.   

    hbolive(紫月亮):
    please give me an example!
      

  6.   

    强奸顾客是拿不到钱的.晕!%&^%&%&%*原来我也会强奸别人......
      

  7.   

    我自己做了个TransVar的类,可以比较轻松的传递变量,要的话发个邮件给我:[email protected]
      

  8.   

    这应该是所谓的跨站脚本执行漏洞吧
    我个人的解决方法是
     关闭register_global,GPCS(get,post,cookie,session)变量取值用$HTTP_*_VARS[];
    开session,每个页面检测session id十分保持一致;
    检测$HTTP_REFERER;
      

  9.   

    先验证用户名和密码,通过验证后传一个随时间变化的32位临时tmp值,session_register,关闭当前浏览器则注销tmp值,文件路径名如下:
    /result.php?tmp=d3050b94a00e2ea51c8d7e6b44c156c9&id=88
      

  10.   

    PHP是可以判断一个数据的来由的。
      

  11.   

    if ($_POST) {
        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 变量的集合,也就是说,所有的来自用户和安全表单的信息。但是从安全角度来看,不能够信任它们。 
      

  12.   

    这些统统不安全,他们完全可以自己写一个程序提交给你数据,包括referer、cookie等也改掉,要安全,用SSL,或者你自己开发一种安全机制。
    老老实实用session算了,真的黑客这点水平也挡不住。
      

  13.   

    是这样的:(举个例子吧,其实很多注册页面是这样做的)首先用户在浏览器的地址栏里输入:
            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.我都是通过数据库来完成的,效率太低,不知道各位虾哥有什么更好的方法?
      

  14.   

    隐藏一些传递变量
    下页中如果没有这些变量则说明不是从第一页传来的第一页中加:<input type='hiddle' name='XXXX' value='自己定'>
      

  15.   

    用session,將变量寫成類的形式,通過方發來陳取,地址栏里直接赋值是沒有用的
      

  16.   

    用session還是安全些,其他的別人都可以自己模仿出來,主要取一個名字很奇怪的session,然後在處理頁面檢查session
    應該還算比較安全
      

  17.   

    to: air_space(空天) 
    HIDDEN 类似的方法在页面源文件里面是能够看到的
    不然人家怎么知道给你在地址栏里面输入什么变量名?
    个人感觉使用  qsnake(开工)  的方法:
      变量取值用$HTTP_*_VARS[]
    可能有作用,但是没有具体测试,不好说。
    所以认为还是合并成一个相对好些。
    当然还需要加上身份识别。TO: laosan(老三)  
    首先不满意你对待  fj100(王子付) 的态度
    另外你所举例分为PAGE1 PAGE2 PAGE3 的方式似乎不对哦
    因为按照那里的方式来说,实际上在PAGE2中也是FORM,不过是HIDDEN的而已
    想看还是能看到的呀。当然我只是说这个不对,那个不对,实际上我也没有什么好办法。
    甚至在对一些操作的时候我也遇到同样的麻烦
    比如对数据库记录的删除时,对方只要找到删除的句子,加上参数就删掉了
    对这个问题表示关注!
      

  18.   

    sandj(不了) :
    谢谢你的回答,也很高兴你假如我们的共同讨论.
    另外,我为我有什么冲撞的地方表示歉意.但这个问题,你认为就这么无药可救了?
    我可对你们有信心哦......
      

  19.   

    在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的删除问题,涉及到删除的程序一般与认证结合吧,要不谁都可以乱删了,只要认证通过,用户做了什么乱七八糟操作,只能是自己负责了,嘿嘿
      

  20.   

    qsnake(开工):
    很欣赏你的意见.
    按照我的page1.php,page2.php,page3.php的想法.
    根据你的好的方法,能否给几个简单的实例源程序?
    谢谢.
      

  21.   

    是不是可以考虑这样做:
    在page1中设置session及给出form。
    在page2中检查session的值,如果错误,返回page1;如果正确,给session一个新的值,然后将page1提交的数据插入database中,并设置一个识别字段,设为无效。在页面上显示page1提交的内容及一个隐藏的域,其值为刚插入数据库的那条数据的识别号。
    在page3中检查新值是否正确,如不正确,返回page1;如果正确,将记录的识别字段设为有效。
      

  22.   

    做个标记。
    从一过来的有个值假定是aa
    但直接输入的这个值就不aa了
    这样不就结了吗?
      

  23.   

    不过这个法子对有心计的人无用还是用session的好。。
      

  24.   

    我对想法是:
    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上查阅更多最新的信息)
      

  25.   

    test1.php:
    <?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方法的參數不會顯示在地址欄上
      

  26.   

    這樣別人即使在地址欄上怎麽更改text1的值,$text1只會認從表單傳過來的text1
      

  27.   

    用这个变量来判断怎么样?if (isset($_ENV["HTTP_REFERER"])&&($_ENV["HTTP_REFERER"]=="page1.php")){
    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>";
    };
      

  28.   


    <?
    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传来的数据
      

  29.   

    不知道有没有人说在窗体提交的时候用隐藏字段的
    <form method="Post" name="Form1" action="deal.php">
    <input type=hidden name="hidden" value="111">
    </form>
    在处理的时候判断$hidden的值!
    如果不为空则处理,否则不处理!
    用EMPTY($HIDDEN)或者isset($hidden)来判断!
      

  30.   

    用HIDDEN方式同样能够看到代码的,自然也能够伪造了
    还是判断数据的来源比较起来安全
      

  31.   

    我建议用session。
    在page1.php里设置一个session变量
    在page2.php里检测这个session是否设置过如果没有设置过

    {
    header("location: page1.php");
     exit();
    }
    这样就不会有问题了
      

  32.   

    我建议用session。
    在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();
    }
    、、、、、、、、、
    }
    这样就不会有问题了
      

  33.   

    这种写法好像不对:
    session_register($flag)
    应该是这种写法吧?
    session_register("flag")不需要变量符号哦:$
      

  34.   

    倒!!!
    用.net吧,那没这问题了!!!!
      

  35.   

    不存在彻底挡住黑客的方法
    session也不好,依赖于客户端浏览器的设置,万一人家就是禁止,咋办?
    还是用数据库保存信息最安全,用
    md5(uniqid($prefix))
    生成唯一串,PHP文件的第一件事就是检查这个串
      

  36.   

    回楼上的话,如果浏览器禁止SESSION(实际上是禁止了cookie),但是session还是可以传递query string的