首页 > 代码库 > PHP 防止站外提交

PHP 防止站外提交

方法一:原理和防盗链一样,都是检查信息来源的http 头.如果不是本站域名就阻止.(当然,这不是绝对的,因为referer是可以伪造的)

<?$servername=$HTTP_SERVER_VARS[‘SERVER_NAME‘]; //获取本站域名$sub_from=$HTTP_SERVER_VARS["HTTP_REFERER"]; //获取来源的referer$sub_len=strlen($servername); //计算本站域名的长度$checkfrom=substr($sub_from,7,$sub_len); //截取来源域名if($checkfrom!=$servername){ //假如截取的来源域名不等于本站域名,则终止.    echo("数据来源有误!请从本站提交!");    exit;}?>

 

处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。

要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,如下所示

<?phpsession_start();            if ($_POST[‘submit‘] == "go"){        //check token        if ($_POST[‘token‘] == $_SESSION[‘token‘]){            //strip_tags            $name = strip_tags($_POST[‘name‘]);            $name = substr($name,0,40);            //clean out any potential hexadecimal characters            $name = cleanHex($name);            //continue processing....        }else{            //stop all processing! remote form posting attempt!        }    }            $token = md5(uniqid(rand(), true));    $_SESSION[‘token‘]= $token;                    function cleanHex($input){        $clean = preg_replace("![][xX]([A-Fa-f0-9]{1,3})!", "",$input);        return $clean;    }    ?>                    <form action="<?php echo $_SERVER[‘PHP_SELF‘];?>" method="post">    <p><label for="name">Name</label>    <input type="text" name="name" id="name" size="20" maxlength="40"/></p>    <input type="hidden" name="token" value="http://www.mamicode.com/<?php echo $token;?>"/>    <p><input type="submit" name="submit" value="http://www.mamicode.com/go"/></p>    </form>