热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【php】php表单防止重复提交(防csrf漏洞)

这篇文章介绍的内容是关于php表单防止重复提交(防csrf漏洞),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下Token浅

这篇文章介绍的内容是关于php表单防止重复提交(防csrf漏洞) ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
Token浅谈

Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。

那么,Token有什么作用?又是什么原理呢?

Token一般用在两个地方——防止表单重复提交、anti csrf攻击(跨站点请求伪造)。

两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。

然后,如果应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。

不过,如果应用于“防止表单重复提交”,服务器端第一次验证相同过后,会将涩session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。

上面的session应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会降低。因此,也可用COOKIE存储验证信息的方法来代替session Token。比如,应对“重复提交”时,当第一次提交后便把已经提交的信息写到COOKIE中,当第二次提交时,由于COOKIE已经有提交记录,因此第二次提交会失败。

不过,COOKIE存储有个致命弱点,如果COOKIE被劫持(xss攻击很容易得到用户COOKIE),那么又一次gameover。黑客将直接实现csrf攻击。

1.首先防范xss攻击

2.验证referrer

3.重要COOKIE设置https only ,比如token

4.使用签名,令牌

5.get只用于查询信息

6.表单提交用post

7.谨慎使用跨脚本注入

所以,安全和高效相对的。具体问题具体对待吧。

 

php表单加入Token防止重复提交

原理在于生成一个随机字符串放在session里,提交表单后来验证这个字符串,可以做到防止他人自己写form来欺骗提交,重复提交或者双击提交。

简单的用php实现的代码如下:

php/** PHP简单利用token防止表单重复提交* 此处理方法纯粹是为了给初学者参考*/session_start();function set_token() {$_SESSION['token'] = md5(microtime(true));}function valid_token() {$return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;set_token();return $return;}//如果token为空则生成一个tokenif(!isset($_SESSION['token']) || $_SESSION['token']=='') {set_token();}if(isset($_POST['test'])){if(!valid_token()){echo "token error";}else{echo '成功提交,Value:'.$_POST['test'];}}?>$_SESSION['token']?>">

上面的比较简单一点的方法,下面的代码更加安全一点。

Token.php

php/** Created on 2013-3-25** To change the template for this generated file go to* Window - Preferences - PHPeclipse - PHP - Code Templates*/function getToken($len &#61; 32, $md5 &#61; true) {# Seed random number generator# Only needed for PHP versions prior to 4.2mt_srand((double) microtime() * 1000000);# Array of characters, adjust as desired$chars &#61; array (&#39;Q&#39;,&#39;&#64;&#39;,&#39;8&#39;,&#39;y&#39;,&#39;%&#39;,&#39;^&#39;,&#39;5&#39;,&#39;Z&#39;,&#39;(&#39;,&#39;G&#39;,&#39;_&#39;,&#39;O&#39;,&#39;&#96;&#39;,&#39;S&#39;,&#39;-&#39;,&#39;N&#39;,&#39;<&#39;,&#39;D&#39;,&#39;{&#39;,&#39;}&#39;,&#39;[&#39;,&#39;]&#39;,&#39;h&#39;,&#39;;&#39;,&#39;W&#39;,&#39;.&#39;,&#39;/&#39;,&#39;|&#39;,&#39;:&#39;,&#39;1&#39;,&#39;E&#39;,&#39;L&#39;,&#39;4&#39;,&#39;&&#39;,&#39;6&#39;,&#39;7&#39;,&#39;#&#39;,&#39;9&#39;,&#39;a&#39;,&#39;A&#39;,&#39;b&#39;,&#39;B&#39;,&#39;~&#39;,&#39;C&#39;,&#39;d&#39;,&#39;>&#39;,&#39;e&#39;,&#39;2&#39;,&#39;f&#39;,&#39;P&#39;,&#39;g&#39;,&#39;)&#39;,&#39;?&#39;,&#39;H&#39;,&#39;i&#39;,&#39;X&#39;,&#39;U&#39;,&#39;J&#39;,&#39;k&#39;,&#39;r&#39;,&#39;l&#39;,&#39;3&#39;,&#39;t&#39;,&#39;M&#39;,&#39;n&#39;,&#39;&#61;&#39;,&#39;o&#39;,&#39;&#43;&#39;,&#39;p&#39;,&#39;F&#39;,&#39;q&#39;,&#39;!&#39;,&#39;K&#39;,&#39;R&#39;,&#39;s&#39;,&#39;c&#39;,&#39;m&#39;,&#39;T&#39;,&#39;v&#39;,&#39;j&#39;,&#39;u&#39;,&#39;V&#39;,&#39;w&#39;,&#39;,&#39;,&#39;x&#39;,&#39;I&#39;,&#39;$&#39;,&#39;Y&#39;,&#39;z&#39;,&#39;*&#39;);# Array indice friendly number of chars;$numChars &#61; count($chars) - 1;$token &#61; &#39;&#39;;# Create random token at the specified lengthfor ($i &#61; 0; $i <$len; $i&#43;&#43;)$token .&#61; $chars[mt_rand(0, $numChars)];# Should token be run through md5?if ($md5) {# Number of 32 char chunks$chunks &#61; ceil(strlen($token) / 32);$md5token &#61; &#39;&#39;;# Run each chunk through md5for ($i &#61; 1; $i <&#61; $chunks; $i&#43;&#43;)$md5token .&#61; md5(substr($token, $i * 32 - 32, 32));# Trim the token$token &#61; substr($md5token, 0, $len);}return $token;}?>

form.php

phpinclude_once("token.php");$token &#61; getToken();session_start();$_SESSION[&#39;token&#39;] &#61; $token;?>$token?>" />

action.php

phpsession_start();if($_POST[&#39;token&#39;] &#61;&#61; $_SESSION[&#39;token&#39;]){unset($_SESSION[&#39;token&#39;]);echo "这是一个正常的提交请求";}else{echo "这是一个非法的提交请求";}?>

 

转:https://www.cnblogs.com/opensmarty/p/10893673.html



推荐阅读
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 如何在微信公众平台集成新浪云服务应用摘要:新浪云服务平台SinaAppEngine(简称SAE)自2009年启动内部研发,并于同年对外开放。本文详细介绍了如何利用SAE的强大功能,在微信公众平台上构建高效、稳定的云服务应用程序,涵盖从环境配置到应用部署的全流程,为开发者提供详尽的技术指导与实践案例。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解
    PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解 ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
  • 长期以来,关于临时表与表变量的优劣之争一直存在,部分技术社区甚至认为表变量几乎毫无用武之地,如缺乏统计信息、不支持事务处理等。然而,实际情况并非如此绝对。本文将从多个角度对比分析临时表与表变量,探讨它们在不同场景下的应用优势及其潜在局限性,帮助开发者更好地选择合适的数据结构。 ... [详细]
author-avatar
JayantKwon
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有