使用随机值时,会话值在ajax页面上更改

时间:2012-12-19 21:40:32

标签: php ajax security session csrf

我试图阻止用户直接访问我的POST/AJAX文件。我决定创建一个随机令牌,我称之为“nonce_key”。此密钥是使用SESSION创建的,然后通过POST传递。如果SESSION密钥与POST相同,则允许访问。问题是有时它不起作用。

这是我的工作流程:
我在index.php上有一个select,当用户更改其值时,它通过ajax调用“change_status.php”。

由于某种原因,index.php上设置的SESSION键与change_status.php上的SESSION键的值不同。

我的functions.php文件中有以下代码

function nonce_key()
{
    return hash('crc32b', time());
}

然后在我的索引中我有

session_start();
require_once 'functions.php';

$_SESSION['nonce_key'] = nonce_key();

echo '
<script  type="text/javascript"> 
$"#change_status").bind("change",function() {
var form_data = {
nonce: "'.$_SESSION['nonce_key'].'",
id: $("#id").val(),
};

$.ajax({

type: "POST",
url: "change_status.php",
data: form_data,
success: function(result) {
  $("#message").slideDown("slow").html(result);
  }
 });
});
</script>'
;

最后在我的change_status.php文件中,我有

session_start();
require_once 'functions.php';
if(isset($_SESSION['nonce_key']) && isset($_POST['nonce']))
{
   if($_SESSION['nonce_key'] == $_POST['nonce'])
   {
     change_app_status($_POST['id']);
   } else echo 'Nonce Invalid';
} else echo 'Not Allowed';

1 个答案:

答案 0 :(得分:0)

检查$ _POST是否有哈希值。你在change_status.php的require_once 'functions.php';中没有必要。你可以使用===

制作一个