一种最优方式防跨站表单提交,用户限时token

就是生成一个随机且变换频繁加密字符串(可逆和不可逆)。放在表单中,等到表单提交后检查。

这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。

对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。这种方式中,字符串的有效时间要设置好,太短了用户体验不好,比如好不容易写好文章提交,令牌却到期了。不得不重写,这很糟糕的体验。因此,TTL过期时间应可设置。

下面是一个网上的不可逆的验证方式,值的推荐:

class Token{
CONST KEY = "your-secret-salt";
static $ttl = 3; //$ttl表示这个随机串的有效时间(秒)
static public function get($uid, $action = -1){
$i = ceil(time() / self::$ttl);
return substr(self::challenge($i . $action . $uid), -12, 10);
}
static public function verify($uid, $crumb, $action = -1){
$i = ceil(time() / self::$ttl);
if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||
substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)
return true;
return false;
}
static private function challenge($data){ //内部私有加密函数
return hash_hmac('md5', $data, self::KEY);
}
}

使用:

在表单中插入一个隐藏的随机串crumb,其中,$uid可以是会员的ID,这样就有独立性。

 <input type="hidden" name="crumb" value="<?php echo Token::get($uid)?>">

在PHP服务器接收端,这样检验。

<?php
if(Token::verify($uid, $_POST['token'])){
//按照正常流程处理表单
}else{
//校验失败,错误提示流程
}

摘自:http://www.vephp.com/jiaocheng/61.html

php 防跨站表单提交的更多相关文章

  1. PHP防止跨站表单提交与同站跨页伪造表单的攻击

    在以前的防止跨站攻击的时候,使用了验证提交的页面是否是同一个站点,这样可以防止普通的攻击,ereg("blog.qita.in",$_SERVER['HTTP_REFERER']) ...

  2. MVC Html.AntiForgeryToken(); 防止跨站伪造请求(建议所有表单提交都加这个)

    视图页面from表单中添加 @Html.AntiForgeryToken(); 然后每个表单提交的时候都会带__RequestVerificationToken 字段 后端控制器验证时添加  [Val ...

  3. JavaWeb -- Struts2,对比, 简单表单提交,校验,防重复提交, 文件上传

    Struts2核心流程图 1. Struts2 和 Struts1 对比 struts1:基于Servlet(ActionServlet),actionForm众多(类的爆炸),action单例(数据 ...

  4. 简单实用的跨域表单POST提交

    我们这里使用了iframe嵌套form表单POST提交,很简单,却能满足get|post等任何复杂情况的要求:缺点是没有返回值. 针对需要的地方加上一个iframe嵌套并塞入隐藏form表单,然后获取 ...

  5. form表单提交没有跨域问题,但ajax提交存在跨域问题

    浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...

  6. webform非表单提交时防xss攻击

     1.webform默认配置下,主动防御了针对表单提交的xss攻击,但这次发生时因为url导致的,所以webform的默认防御机制不起作用  webform下输出非表单提交获得的数据的时候,要加htm ...

  7. Laravel框架之CSRF防跨站攻击

    laravel框架的csrf防跨站攻击,简单的意思就是说为了防止别人自己写表单非法提交,非法绕过前台的验证,直接将数据往后台执行. 一般的网站如果没有这些安全措施,比较容易被攻击.当然了也还要有其他的 ...

  8. [转]django自定义表单提交

    原文网址:http://www.cnblogs.com/retop/p/4677148.html 注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义 ...

  9. Django初体验(一):自定义表单提交

    注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CS ...

随机推荐

  1. HTML4入门

    这篇来介绍下超链接和网站架构,做好准备要开始了! 超链接:从一个文档链接到另一个文档,也可以式文档的指定部分及文档内跳转,也俗称设置锚点:点击超链接将使网络浏览器跳转到另一个网址.url可以指向HTM ...

  2. git删除掉已经保存的用户名密码

    以保存的用户名密码删除,先找到变量存在的位置: git config -l To help track down the setting, I'd try to use: git config --l ...

  3. [LeetCode] Unique Morse Code Words 独特的摩斯码单词

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  4. HDU 6321 Dynamic Graph Matching

    HDU 6321 Dynamic Graph Matching (状压DP) Problem C. Dynamic Graph Matching Time Limit: 8000/4000 MS (J ...

  5. Appium-Python-Windows环境搭建笔记

    Appium版本:1.11.0 操作系统:Windows7-64位 开发语言:Python 3.7.2 测试应用平台:安卓 5.1.1 Appium服务端 一.JDK 也许你会觉得很奇怪,我搭建Pyt ...

  6. Confluo: Distributed Monitoring and Diagnosis Stack for High-speed Networks

    https://rise.cs.berkeley.edu/blog/confluo-millisecond-level-queries-on-large-scale-streaming-data/ht ...

  7. 20164320 王浩 Exp1 PC平台逆向破解

    一.逆向及Bof基础实践说明 1.1实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 手工修 ...

  8. 常用的 jQuery 事件

    $(document).ready(): $(document).ready() 方法允许我们在文档完全加载完后执行函数. click(): click() 方法是当按钮点击事件被触发时会调用一个函数 ...

  9. linux kettle

    https://blog.csdn.net/zzq900503/article/details/79110810

  10. Flask的Windows部署:mod_wsgi + Apache

    参考1:https://blog.csdn.net/mist99/article/details/80771289 参考2:https://blog.csdn.net/firefox1/article ...