执行CSRF令牌所有形式使用POST方法
从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性。
php CSRF Guard
function csrfguard_generate_token($unique_form_name)
{
if (function_exists("hash_algos") and in_array("sha512",hash_algos()))
{
$token=hash("sha512",mt_rand(0,mt_getrandmax()));
}
else
{
$token=' ';
for ($i=0;$i<128;++$i)
{
$r=mt_rand(0,35);
if ($r<26)
{
$c=chr(ord('a')+$r);
}
else
{
$c=chr(ord('0')+$r-26);
}
$token.=$c;
}
}
store_in_session($unique_form_name,$token);
return $token;
}
function csrfguard_validate_token($unique_form_name,$token_value)
{
$token=get_from_session($unique_form_name);
if ($token===false)
{
return false;
}
elseif ($token===$token_value)
{
$result=true;
}
else
{
$result=false;
}
unset_session($unique_form_name);
return $result;
}
function csrfguard_replace_forms($form_data_html)
{
$count=preg_match_all("/<form(.*?)>(.*?)<\\/form>/is",$form_data_html,$matches,PREG_SET_ORDER);
if (is_array($matches))
{
foreach ($matches as $m)
{
if (strpos($m[1],"nocsrf")!==false) { continue; }
$name="CSRFGuard_".mt_rand(0,mt_getrandmax());
$token=csrfguard_generate_token($name);
$form_data_html=str_replace($m[0],
"<form{$m[1]}>
<input type='hidden' name='CSRFName' value='{$name}' />
<input type='hidden' name='CSRFToken' value='{$token}' />{$m[2]}</form>",$form_data_html);
}
}
return $form_data_html;
}
function csrfguard_inject()
{
$data=ob_get_clean();
$data=csrfguard_replace_forms($data);
echo $data;
}
function csrfguard_start()
{
if (count($_POST))
{
if ( !isset($_POST['CSRFName']) or !isset($_POST['CSRFToken']) )
{
trigger_error("No CSRFName found, probable invalid request.",E_USER_ERROR);
}
$name =$_POST['CSRFName'];
$token=$_POST['CSRFToken'];
if (!csrfguard_validate_token($name, $token))
{
trigger_error("Invalid CSRF token.",E_USER_ERROR);
}
}
ob_start();
/* adding double quotes for "csrfguard_inject" to prevent:
Notice: Use of undefined constant csrfguard_inject - assumed 'csrfguard_inject' */
register_shutdown_function("csrfguard_inject");
}
csrfguard_start(2881064151);
前三个功能,是一个抽象的概念如何会话变量存储。如果你不使用PHP会话更换。生成功能,创建一个随机的安全一次性CSRF令牌。如果SHA512是可用的,它被使用,否则产生一个512位的随机字符串在同一格式。这个功能也将生成一个唯一的名称下的令牌在会话变量。验证功能,检查唯一名下的令牌。有三步:
会话不主动:验证成功(没有CSRF风险)
会话发现但不相同,或令牌不发现:验证失败
会话发现相同:验证成功
任何情况下,该函数删除会话令牌,确保一例
替换功能,接收HTML数据的一部分,发现所有<form>事件并添加了两个隐藏域他们:csrfname和csrftoken。如果任何这些形式有一个属性或值nocsrf”,除了不会被执行(注意,使用默认的注入,这个检测时间)。
其他两个函数,将开始是一个演示如何使用其他功能。使用输出缓冲对你的整个输出不推荐(有些图书馆可能转储输出缓冲)。这种默认行为,执行CSRF令牌所有形式使用POST方法。它是假定没有任何敏感的操作方法是在应用程序得到执行,由RFC 2616要求
为了测试这些代码,添加以下HTML吧:
<form method='post'>
<input type='text' name='test' value='<?php echo "testing"?>' />
<input type='submit' />
</form>
<form class='nocsrf'>
</form>
执行CSRF令牌所有形式使用POST方法的更多相关文章
- Django 如何让ajax的POST方法带上CSRF令牌
问题 大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提 ...
- CSRF漏洞原理说明与利用方法
翻译者:Fireweed 原文链接:http://seclab.stanford.edu/websec/ 一 .什么是CSRF Cross-Site Request Forgery(CSRF),中文一 ...
- 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}
我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我收到以下响应: 403: CSRF Failed: CSRF token missing ...
- python---django中模板渲染(csrf令牌使用,自定义模板函数)
使用终端,可以更方便的去实验,但是没有提示信息: 在项目目录下: D:\MyPython\day23\HelloWorld>python manage.py shell 开始实验: >&g ...
- csrf原理及flask的处理方法
csrf原理及flask的处理方法 为什么需要CSRF? Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心.尽管如此,如果你有不包含表单的视图,那么它们仍需要保护. 例如,由 A ...
- spring定时任务执行两次的原因与解决方法
spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/7031266 ...
- C#异步执行带有返回值和参数的方法,且获取返回值
很多时候需要用到这些小知识点,做做笔记一起成长 下面是需要异步执行的方法 //获取所有的邮件 private List<EmailModel> GetEmailOnlyCount(POP3 ...
- 【Navicat】使用navicat执行sql 查询速度很慢解决方法
========================== Navicat 远程连接Mysql执行普通sql速度慢问题: 场景: navicat可以连接上 远程服务器的mysql.但是在navicat执行最 ...
- Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)
Python有时需要动态的创造Python代码,然后将其作为语句执行 或 作为表达式计算. exec用于执行存储在字符串中的Python代码. 1. 语句与表达式的区别:表达式是 某事,语句是 ...
随机推荐
- win7下cmd常用命令
当在win7下执行命令出现右图状况 状况下可以采用鼠标放在指定的文件夹然后按shilt+鼠标右键可以出现下图的界面直接在此处打开cmd
- java 多态和内部类
接口跟接口之间存在继承关系 一个接口可以继承多个接口 一个非抽象类:必须实现接口中的所有方法 一个抽象类实现接口 可以不实现接口中的方法 但是继承与抽象类的类必须要是实现接口中的方法 多态:一个对 ...
- PowerDisner15 关于生成表带双""号问题
我们可以尝试在DBMS配置文件中修改相应的格式来解决. 在PowerDesigner中 选择 Database->Edit current database->Script->Sql ...
- Toad for Sqlserver
# 设置制表符 从sqlserver拷贝的存储过程粘贴到Toad,代码变得不整齐了,这就需要设置下制表符的大小.
- vmware 中ubuntu客户机 安装vmware tool vmhgfs 共享文件夹失败处理
vmware版本:10.0.0 build-1295980 ubuntu版本:3.13.0-62-generic 先安装的vmware workstation自带光盘中vmare tools包,安装完 ...
- Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法
问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...
- python 小程序大文件的拆分合并
1. 将大文件拆分为小文件 I 通过二进制的方式将大文件读取出来,将其拆分存,以不同的文件方式存放在一个目录下面 II 提供两种操作方式交互式和命令行模式 #! usr/bin/python # -* ...
- [转]Windows7文件夹转移清理臃肿的C盘
当你使用Windows的时候,你会发现无论哪个版本的Windows,系统都会默认将用户文件夹和程序数据文件夹(xp下是Documents and Settings文件夹,而windows7和vista ...
- openswan-ipsec.conf配置说明
Name ipsec.conf - IPsec configuration and connections Description The optional ipsec.conf file speci ...
- maven-javaServlet-文件上传
十月 25, 2016 5:00:39 下午 org.apache.catalina.core.AprLifecycleListener init信息: The APR based Apache To ...