0

我开发了一个视频游戏社交网络,并且我拥有一个基于用户 ID 作为密钥的针对 csrf 的安全系统。

因为这不安全,所以我需要知道如何在一个始终发送所有 POST 请求的 TOKEN 字段中实现我的所有请求 POST

有什么方法可以实现吗?也许用javascript?

非常感谢人们:)

4

2 回答 2

0

使用$_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>

每次您向用户展示表单时,只需要唯一地生成和存储令牌即可。

于 2013-10-25T20:27:57.860 回答
0

我为 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; });

于 2013-10-25T22:45:12.720 回答