`

PHP 防止远程表单提交

    博客分类:
  • php
php 
阅读更多

Web 的好处是可以分享信息和服务。坏处也是可以分享信息和服务,因为有些人做事毫无顾忌。
以表单为例。任何人都能够访问一个 Web 站点,并使用浏览器上的 File > Save As 建立表单的本地副本。然后,他可以修改 action 参数来指向一个完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因为表单在这个站点上),做他希望的任何修改,点击 Submit,服务器会把这个表单数据作为合法通信流接收。
首先可能考虑检查 $_SERVER['HTTP_REFERER'],从而判断请求是否来自自己的服务器,这种方法可以挡住大多数恶意用户,但是挡不住最高明的黑客。这些人足够聪明,能够篡改头部中的引用者信息,使表单的远程副本看起来像是从您的服务器提交的。
处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。
要创建随机的令牌,可以使用 PHP 内置的 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>   

 这种技术是有效的,这是因为在 PHP 中会话数据无法在服务器之间迁移。即使有人获得了您的 PHP 源代码,将它转移到自己的服务器上,并向您的服务器提交信息,您的服务器接收的也只是空的或畸形的会话令牌和原来提供的表单令牌。它们不匹配,远程表单提交就失败了。

分享到:
评论
1 楼 yuvista 2012-07-27  
相见恨晚,关于跨域提交,表单验证,我前段时间也在做啊,上几天刚弄完,同苦啊朋友,你也饶了不少圈子吧

咱们的思路基本一致

相关推荐

    php+Ajax远程加载防止重复提交

    php+Ajax远程加载防止重复提交,登录表单loading效果,一个提高用户体验,二个防止避免重复提交表单,ajax判断加载是否完成。

    php防止站外远程提交表单的方法

    本文实例讲述了php防止站外远程提交表单的方法,分享给大家供大家参考。具体实现方法如下: 一般来说防止站长提交表单无非就是对每一次打开表单或提交数据都会需要加一个token来进行验证了,这个其实与验证码做法没...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    POSCMS免费版 v3.2.0 bulid1118.zip

    采用CI框架完善的安全处理类库,对提交数据信息进行严格验证,防止Xss攻击 附件可设置上传到指定的web目录,实现附件上传目录与web程序目录的分离 开放API 可通过开放API接口获取POSCMS数据资源,也可以发布文章...

    超实用的jQuery代码段

    2.22 防止单个页面重复提交按钮 2.23 取得列表控件选中的option对象 2.24 限制输入框仅接受特殊字符的输入 2.25 禁止页面内全部超链接 2.26 实现动态组合列表框 2.27 如何使用属性过滤器 2.28 如何测试某个元素是否...

    PHPCMS网站系统最新官方版

    修复 -- 会员组有权限,但没有对应栏目权限时,用户可构造表单进行指定栏目提交数据。 修复投稿关键字字段存在SQL注入问题 修复描述字段填入特殊字符时,推送时出现的SQL报错 升级方法: 一、后台自动升级 进入...

    JavaScript网页特效范例宝典源码

    实例080 防止表单重复提交 124 实例081 自动提交表单 125 实例082 通过for循环获取表单元素的中文名称 126 实例083 可以提交到不同处理页的表单 127 第3章 实用JavaScript函数 129 3.1 数据验证 130 实例084 通过...

    zzzphp免费开源建站系统含手机站-PHP

    9.搜索表单推荐改为get提交,防止浏览器返回报错bug。 10.短连接支持短横线。 20210428-zzzphp V2.0.4正式版 1.修复一处安全漏洞,请及时更新。 2.修复content循环不支持,编辑器类型参数显示代码的bug。 3.修复无法...

    xheditor-1.1.14

    参数值:表单提交按钮的ID值,默认在form表单上绑定submit以同步结果 说明:通过本参数,在非标准submit提交环境下,比如AJAX提交,可以由用户点击提交按钮以触发编辑器最新值的同步 备注:v1.1.7新添加 onPaste:...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    如果选择关闭,那么模板中所有相关的验证码表单都要手工去掉保存提交。  (10)服务升级设置: 这里可以设置升级VIP费用、明星榜费用、对认证会员打折设置等。包括人民币与金币汇率。 消费卡使用期限,即后台...

    UWA 2.X 通用建站系统 v2.1.0

    [增强]修复表单提交时 uploadify 是否正在上传附件判断 [增强]一键更新 [修正]修复地址拼装函数Url::U() [增强]完善缓存清除记录,优化缓存清除过程 [修正]完善会员中心档案链接预览 [修正]完善上传类AUpload获取...

    ExtAspNet_v2.3.2_dll

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

Global site tag (gtag.js) - Google Analytics