csrf防御 php,跨站请求伪造CSRF的防御实例(PHP版本)

跨站请求伪造CSRF的防御:One-Time Tokens(不同的表单包含一个不同的伪随机值)

在实现One-Time

Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提

交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单

都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

以下我的实现:

1).先是令牌生成函数(gen_token()):

function gen_token() {

//这里我是贪方便,实际上单使用Rand()得出的随机数作为令牌,也是不安全的。

$token = md5(uniqid(rand(), true));

return $token;

}

2).然后是Session令牌生成函数(gen_stoken()):

function gen_stoken() {

$pToken = "";

if($_SESSION[STOKEN_NAME] == $pToken){

//没有值,赋新值

$_SESSION[STOKEN_NAME] = gen_token();

}

else{

//继续使用旧的值

}

}

?>

3).WEB表单生成隐藏输入域的函数:

function gen_input() {

gen_stoken();

echo “

value=\”" . $_SESSION[STOKEN_NAME] . “\”> “;

}

?>

4).WEB表单结构:

session_start();

include(”functions.php”);

?>

gen_input(); ?>

5).服务端核对令牌:

这个很简单,这里就不再啰嗦了。

上面这个其实不完全符合“并行会话的兼容”的规则,大家可以在此基础上修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值