我开发了一个视频游戏社交网络,并且我拥有一个基于用户 ID 作为密钥的针对 csrf 的安全系统。
因为这不安全,所以我需要知道如何在一个始终发送所有 POST 请求的 TOKEN 字段中实现我的所有请求 POST
有什么方法可以实现吗?也许用javascript?
非常感谢人们:)
我开发了一个视频游戏社交网络,并且我拥有一个基于用户 ID 作为密钥的针对 csrf 的安全系统。
因为这不安全,所以我需要知道如何在一个始终发送所有 POST 请求的 TOKEN 字段中实现我的所有请求 POST
有什么方法可以实现吗?也许用javascript?
非常感谢人们:)
使用$_SESSION
类似下面的内容将是一个开始。GET
用于代替POST
仅用于说明目的。
<?php
session_start();
if( ! isset($_GET['submit']) ) {
$_SESSION['crsf_token'] = md5(rand());
echo 'token set';
} else {
printf("post: %s - session: %s<br/>", $_GET['token'], $_SESSION['crsf_token']);
if( $_GET['token'] !== $_SESSION['crsf_token'] ) {
unset($_SESSION['crsf_token']);
echo 'CSRF!';
} else {
unset($_SESSION['crsf_token']);
echo 'Not CSRF.';
}
}
?>
<form action="" method="GET">
<input type="hidden" name="token" value="<? echo $_SESSION['crsf_token']; ?>" />
<input type="submit" name="submit">
</form>
每次您向用户展示表单时,只需要唯一地生成和存储令牌即可。
我为 CI 找到了这个很棒的课程:http: //net.tutsplus.com/tutorials/php/protect-a-codeigniter-application-against-csrf/
该库挂钩输出中的所有表单并插入隐藏字段
我使用这个函数在所有 ajax 请求中挂钩这个字段
$(document).ajaxSend(function(e, xhr, options) { var csrf_token = $("meta[name=csrf-token]").attr("content"); options.data = options.data+"&" +$("meta[name=csrf-name]").attr("content")+"="+csrf_token; });