在网上找到一段防止远程提交表单的demo,它用的是md5(uniqid(rand()))生成令牌验证的方法,如下:
<?php
session_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="<?php echo $token;?>"/>
<p><input type="submit" name="submit" value="go"/></p>
</form>
?>我的问题是:
如果保存sessionID的cookie可以被找到,那不就可以在远程提交这个表单,然后通过一些操作修改请求的header头,把获取的cookie放进去。
如果上面这种方法可行的话,那这段代码不就不能起到防止远程提交表单的作用了吗?

解决方案 »

  1.   

    这个不一定吧!session的定义是在服务器端生成一个session文件,并放在服务器端,并生成一个session_id,通过cookie放到客户通,当你访问session的时候会用到客户端的session_id;但是是不是可以直接这个session_id去访问服务端的session文件,这个并不清楚,若有方法的话,那就可以通过session_id直接访问session信息了,这个防止远程表单提交的就不起作用了,反之,则ok!
      

  2.   

    $token = md5(uniqid(rand(), true));   这个数字是随机唯一的吧!!!
      

  3.   

    sessionID 是动态的,找到了也没有!不过你的这个代码只能方式静态表单的提交。并不能防止机器人提交
    只要先进入你的页面(当然是需要的,因为要知道你的表单是否变化了),于是你那宝贵的 token 就到我手上了,然后就.....
      

  4.   

    用户能访问的, 计算机一样可以搞.先访问表单页面正则取TOKEN, 然后提交表单把TOKEN也一起提交了.